1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#[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) } } )* } }