aboutsummaryrefslogtreecommitdiff
path: root/src/util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util.rs')
-rw-r--r--src/util.rs43
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, ()>;
+}