use auto_delegate::{delegate, Delegate}; #[delegate] trait Calc { fn calc(&self, x1: usize, x2: usize) -> usize; } #[delegate] trait Label: Calc { fn label(&self) -> String; } #[derive(Default)] struct CalcAdd; impl Label for CalcAdd { fn label(&self) -> String { String::from("add") } } impl Calc for CalcAdd { fn calc(&self, x1: usize, x2: usize) -> usize { x1 + x2 } } #[derive(Default)] struct CalcSub; impl Calc for CalcSub { fn calc(&self, x1: usize, x2: usize) -> usize { x1 - x2 } } impl Label for CalcSub { fn label(&self) -> String { String::from("sub") } } #[derive(Delegate)] #[to(Calc, Label)] enum Calculator { Add(CalcAdd), Sub(CalcSub), } fn main() { let add = Calculator::Add(CalcAdd); assert_eq!(add.calc(3, 2), 5); assert_eq!(add.label(), "add".to_string()); let sub = Calculator::Sub(CalcSub); assert_eq!(sub.calc(3, 2), 1); assert_eq!(sub.label(), "sub".to_string()); }