#[macro_export]
macro_rules! typeenum {
( $(#[$attr:meta])*
$name:ident,
$ty:ty,
{
$($x:expr => $y:ident),+ $(,)*
}
$(,{
$( $x1:pat => $y1:ident ),* $(,)*
})?
) => {
#[derive(Clone, Copy, Debug, Hash, Eq, Ord, PartialEq, PartialOrd)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
$(#[$attr])*
pub enum $name {
$($y),+,
$($($y1($ty),)?)?
Unimplemented($ty),
}
impl From<$ty> for $name {
#[allow(unreachable_patterns)]
fn from(f: $ty) -> $name {
match f {
$($x => $name::$y,)+
$($($x1 => $name::$y1(f),)?)?
u => $name::Unimplemented(u),
}
}
}
impl From<$name> for $ty {
fn from(s: $name) -> $ty {
match s {
$($name::$y => $x,)+
$($($name::$y1(u) => u,)?)?
$name::Unimplemented(u) => u,
}
}
}
impl std::fmt::Display for $name {
fn fmt(&self, f: &mut std::fmt::Formatter)
-> Result<(), std::fmt::Error>
{
match self {
$($name::$y => write!(f, stringify!($y))),+,
$($($name::$y1(u) => write!(f, "{} ({})", stringify!($u), u),)?)?
$name::Unimplemented(u) =>
write!(f, "unknown-{}-{}", stringify!($name), u)
}
}
}
}
}