macro_rules! maybe_impl { ($left:ident, $right:ident, $l_fn:ident, $r_fn:ident) => { fn $l_fn(value: T) -> Maybe { Maybe::$left(value) } fn $r_fn() -> Maybe { Maybe::$right } }; } enum Maybe { Just(T), Nothing, } impl Maybe { maybe_impl!(Just, Nothing, just, nothing); } fn main() { let _ = Maybe::just(14); let _: Maybe = Maybe::nothing(); }