// Copyright 2019 Robin Krahl // SPDX-License-Identifier: GPL-3.0-or-later use core::marker::Sized; macro_rules! enum_cmd { ( $(#[$outer:meta])* pub enum $name:ident { $($var:ident($cmd:ident) = $num:expr),+ $(,)* } ) => { enum_u8! { $(#[$outer])* pub enum $name { $( $var = $num, )* } } impl $name { pub fn execute(&self, data: &[u8], buf: &mut [u8]) -> CommandStatus { match *self { $( $name::$var => crate::commands::execute::<$cmd>(data, buf), )* } } } }; } macro_rules! enum_u8 { ( $(#[$outer:meta])* pub enum $name:ident { $($var:ident = $num:expr),+ $(,)* } ) => { $(#[$outer])* #[repr(u8)] pub enum $name { $( $var = $num, )* } impl crate::util::TryFrom for $name { fn try_from(val: u8) -> ::core::result::Result { match val { $( $num => Ok($name::$var), )* _ => Err(()) } } } impl From<$name> for u8 { fn from(val: $name) -> u8 { val as u8 } } }; } pub trait TryFrom: Sized { fn try_from(val: T) -> Result; }