// 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: &crate::device::RequestData, buf: &mut crate::device::ResponseData, ) -> 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 ::serde::Serialize for $name { fn serialize(&self, serializer: S) -> Result { serializer.serialize_u8((*self).into()) } } impl From<$name> for u8 { fn from(val: $name) -> u8 { val as u8 } } }; } macro_rules! assert_maximum_size { ($t:ident, $e: expr) => { ::static_assertions::const_assert!( ::core::mem::size_of::<$t>() <= $e ); } } pub trait TryFrom: Sized { fn try_from(val: T) -> Result; }