Maraiah/src/durandal/cenum.rs

69 lines
1.3 KiB
Rust

//! C representation enumerations.
/// Creates an enumeration and function for converting a representation into
/// the enumeration type.
#[macro_export]
macro_rules! c_enum
{
(
$(#[$outer:meta])*
$V:vis enum $E:ident: $T:ty
{
$($value:expr => $Enum:ident,)+
}
) => {
$(#[$outer])*
$V enum $E
{
$($Enum,)+
}
impl $E
{
pub fn from_repr(n: $T) -> Result<$E, ReprError>
{
match n {
$($value => Ok($E::$Enum),)+
n => Err(ReprError(n.into()))
}
}
}
};
}
#[cfg(test)]
mod test
{
use crate::durandal::err::ReprError;
c_enum! {
#[derive(Debug, PartialEq)]
pub enum TestEnum: u16
{
0 => Zero,
1 => One,
2 => Two,
}
}
#[test]
fn c_enum_should_be_ok()
{
assert_eq!(TestEnum::from_repr(0), Ok(TestEnum::Zero));
assert_eq!(TestEnum::from_repr(1), Ok(TestEnum::One));
assert_eq!(TestEnum::from_repr(2), Ok(TestEnum::Two));
assert_eq!(TestEnum::from_repr(3), Err(ReprError(3)));
assert_eq!(TestEnum::from_repr(4), Err(ReprError(4)));
assert_eq!(TestEnum::from_repr(5), Err(ReprError(5)));
}
#[test]
#[should_panic]
fn c_enum_should_error()
{
TestEnum::from_repr(3).unwrap();
}
}
// EOF