pub extern crate paste; #[macro_export] macro_rules! impl_setup { () => { pub trait As { fn consume(self: Box) -> Option>; fn cast(&self) -> Option<&T>; fn cast_mut(&mut self) -> Option<&mut T>; } }; } #[macro_export] macro_rules! impl_cast { ($base:ident, $trait:ident) => { $crate::paste::paste! { impl As for T { fn consume(self: Box) -> Option> { Some(self) } fn cast(&self) -> Option<&dyn $trait> { Some(self) } fn cast_mut(&mut self) -> Option<&mut dyn $trait> { Some(self) } } impl As for T { default fn consume(self: Box) -> Option> { None } default fn cast(&self) -> Option<&dyn $trait> { None } default fn cast_mut(&mut self) -> Option<&mut dyn $trait> { None } } } }; }