diff options
Diffstat (limited to 'src/util.rs')
-rw-r--r-- | src/util.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 0000000..4fc4448 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,43 @@ +// Copyright 2019 Robin Krahl <robin.krahl@ireas.org> +// SPDX-License-Identifier: GPL-3.0-or-later + +use core::marker::Sized; + +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<u8> for $name { + fn try_from(val: u8) -> ::core::result::Result<Self, ()> { + match val { + $( + $num => Ok($name::$var), + )* + _ => Err(()) + } + } + } + + impl From<$name> for u8 { + fn from(val: $name) -> u8 { + val as u8 + } + } + }; +} + +pub trait TryFrom<T>: Sized { + fn try_from(val: T) -> Result<Self, ()>; +} |