# either_trait_macro An attribute-like macro to implement traits for `Either` (defined in [`either`](https://crates.io/crates/either) crate). If your trait is implemented for both type `A` and `B`, then it is automatically implemented for `Either`. ## Usage When defining a trait, add the attribute `#[either_trait]`. ## Example ```rust use either::Either; use either_trait_macro::either_trait; #[either_trait] /// Apply a function `n` times. trait Apply { fn times(&self, t: T, f: F) -> T where F: Fn(T) -> T; } struct Once; impl Apply for Once { fn times(&self, t: T, f: F) -> T where F: Fn(T) -> T, { f(t) } } impl Apply for u32 { fn times(&self, t: T, f: F) -> T where F: Fn(T) -> T, { let mut t = t; for _ in 0..*self { t = f(t); } t } } let either: Either = Either::Left(Once); assert_eq!(either.times(1, |x| x + 2), 3); ``` ## Limitations This macro only supports traits without any associated constant or associated type. The first parameter of a trait method must be `self`, `&self` or `&mut self`. The types of other parameters and the return type must not contain `Self`.