#[macro_export]
macro_rules! bidirectional_enum_mappings {
($name:ident, $type:ty, { $($variant:ident => $value:expr),* $(,)? }) => {
impl $name {
pub fn to_value(&self) -> $type {
match self {
$(
$name::$variant => $value,
)*
}
}
pub fn from_value(value: $type) -> Option<$name> {
match value {
$(
$value => Some($name::$variant),
)*
_ => None,
}
}
}
};
}
#[macro_export]
macro_rules! bidirectional_enum_mappings_with_mode {
($name:ident, $type:ty, $mode_name:ident, { $($mode:ident => {$($variant:ident => $value:expr),* $(,)?}),* $(,)? }) => {
#[derive(Debug, Clone, Copy)]
pub enum $mode_name {
$($mode),*
}
impl $name {
pub fn to_value_mode(&self, mode: $mode_name) -> $type {
match mode {
$(
$mode_name::$mode => match self {
$(
$name::$variant => $value,
)*
},
)*
}
}
pub fn from_value_mode(value: $type, mode: $mode_name) -> Option<$name> {
match mode {
$(
$mode_name::$mode => Some(match value {
$(
$value => $name::$variant,
)*
_ => return None
}),
)*
}
}
pub fn from_value(value: $type) -> Option<($name, $mode_name)> {
match value {
$(
$( $value => Some(($name::$variant, $mode_name::$mode)), )*
)*
_ => None,
}
}
}
};
}
#[macro_export]
macro_rules! bidirectional_enum_mappings_with_existing_mode {
($name:ident, $type:ty, $mode_name:ident, { $($mode:ident => { $($variant:ident => $value:expr),* $(,)? }),* $(,)? }) => {
impl $name {
pub fn to_value_mode(&self, mode: $mode_name) -> $type {
match mode {
$(
$mode_name::$mode => match self {
$(
$name::$variant => $value,
)*
},
)*
}
}
pub fn from_value_mode(value: $type, mode: $mode_name) -> Option<$name> {
match mode {
$(
$mode_name::$mode => Some(match value {
$(
$value => $name::$variant,
)*
_ => return None,
}),
)*
}
}
pub fn from_value(value: $type) -> Option<($name, $mode_name)> {
match value {
$(
$(
$value => Some(($name::$variant, $mode_name::$mode)),
)*
)*
_ => None,
}
}
}
};
}