#[macro_export]
macro_rules! trait_enum {
($trait:ident, $enum:ident, $( $item:ident ) , *) => {
enum $enum {
$(
$item($item),
)*
}
impl std::ops::Deref for $enum {
type Target = $trait;
fn deref(&self) -> &Self::Target {
match self {
$(
$enum::$item(x) => x,
)*
}
}
}
impl From<$enum> for Box<$trait> {
fn from(input: $enum) -> Self {
match input {
$(
$enum::$item(x) => Box::new(x),
)*
}
}
}
impl<'a> From<&'a $enum> for &'a $trait {
fn from(input: &'a $enum) -> Self {
&**input
}
}
impl<'a> AsRef<$trait + 'a> for $enum {
fn as_ref(&self) -> &($trait + 'a) {
&**self
}
}
impl<'a> std::borrow::Borrow<$trait + 'a> for $enum {
fn borrow(&self) -> &($trait + 'a) {
&**self
}
}
$(
impl From<$item> for $enum {
fn from(input: $item) -> Self {
$enum::$item(input)
}
}
)*
}
}