#[macro_export(local_inner_macros)]
macro_rules! enum_gen {
{ $(#[$documentation:meta])*
$enum_name:ident
entry:
$($entry:ident$(($bla:ident))?),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($entry$(($bla))?),*
}
};
{ $(#[$documentation:meta])*
$enum_name:ident
mapping:
$($equivalent:ident),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($equivalent($equivalent)),*
}
$(impl From<$equivalent> for $enum_name {
fn from(v: $equivalent) -> Self {
$enum_name::$equivalent(v)
}
})*
};
{ $(#[$documentation:meta])*
$enum_name:ident
mapping:
$($equivalent:ident to $value_name:ident),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($value_name($equivalent)),*
}
$(impl From<$equivalent> for $enum_name {
fn from(v: $equivalent) -> Self {
$enum_name::$value_name(v)
}
})*
};
{ $(#[$documentation:meta])*
$enum_name:ident
entry:
$($entry:ident$(($bla:ident))?),*
mapping:
$($equivalent:ident),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($entry$(($bla))?),*,
$($equivalent($equivalent)),*
}
$(impl From<$equivalent> for $enum_name {
fn from(v: $equivalent) -> Self {
$enum_name::$equivalent(v)
}
})*
};
{ $(#[$documentation:meta])*
$enum_name:ident
entry:
$($entry:ident$(($bla:ident))?),*
mapping:
$($equivalent:ident to $value_name:ident),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($entry$(($bla))?),*,
$($value_name($equivalent)),*
}
$(impl From<$equivalent> for $enum_name {
fn from(v: $equivalent) -> Self {
$enum_name::$value_name(v)
}
})*
};
{ $(#[$documentation:meta])*
$enum_name:ident
generalization:
$($destination:ident <= $($source:ident);*),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($destination),*,
}
$($(impl From<$source> for $enum_name {
fn from(_: $source) -> Self {
$enum_name::$destination
}
})*)*
};
{ $(#[$documentation:meta])*
$enum_name:ident
entry:
$($entry:ident$(($bla:ident))?),*
generalization:
$($destination:ident <= $($source:ident);*),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($entry$(($bla))?),*,
$($destination),*,
}
$($(impl From<$source> for $enum_name {
fn from(_: $source) -> Self {
$enum_name::$destination
}
})*)*
};
{ $(#[$documentation:meta])*
$enum_name:ident
entry:
$($entry:ident$(($bla:ident))?),*
mapping:
$($equivalent:ident),*
generalization:
$($destination:ident <= $($source:ident);*),*}
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
pub enum $enum_name {
$($entry$(($bla))?),*,
$($equivalent($equivalent)),*,
$($destination),*,
}
$(impl From<$equivalent> for $enum_name {
fn from(v: $equivalent) -> Self {
$enum_name::$equivalent(v)
}
})*
$($(impl From<$source> for $enum_name {
fn from(_: $source) -> Self {
$enum_name::$destination
}
})*)*
};
{ $(#[$documentation:meta])*
$name:ident
unknown_translates_to:
$unknown_entry:ident = $unn:ident::$uvalue:ident
entry:
$($entry:ident = $nn:ident::$value:ident),* }
=> {
$(#[$documentation])*
#[derive(Debug, Clone, Copy, Eq, Hash, PartialEq)]
#[repr(i32)]
pub enum $name {
$($entry = $nn::$value),*,
$unknown_entry = $unn::$uvalue
}
impl Into<$name> for i32 {
fn into(self) -> $name {
match self {
$($nn::$value => $name::$entry),*,
_ => $name::$unknown_entry
}
}
}
impl Display for $name {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
core::write!(f, "{}::{:?}", core::stringify!($name), self )
}
}
};
}