#![feature(more_qualified_paths)] mod foo_bar { pub enum Example { Example1 {}, Example2 {}, } } fn main() { foo!(crate::foo_bar::Example, Example1); let i1 = foo_bar::Example::Example1 {}; assert_eq!(i1.foo_example(), 1); let i2 = foo_bar::Example::Example2 {}; assert_eq!(i2.foo_example(), 2); } #[macro_export] macro_rules! foo { ($struct:path, $variant:ident) => { impl $struct { pub fn foo_example(&self) -> i32 { match self { <$struct>::$variant { .. } => 1, _ => 2, } } } }; }