From 8d9241e033e1babeccee49ab848c15edd8831516 Mon Sep 17 00:00:00 2001 From: Robin Krahl Date: Mon, 18 Feb 2019 11:39:39 +0000 Subject: Add enum_u8 macro to simplify enum conversion We need several enums that map to a u8 value. This patch adds the enum_u8 macro that automatically derives the From and TryFrom macros for an enum to make these conversions easier. As TryFrom is not stable yet, we add our own TryFrom trait. --- src/util.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/util.rs (limited to 'src/util.rs') 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 +// 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 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; +} -- cgit v1.2.1