use auto_delegate_impl::{delegate, Delegate};
#[delegate]
trait Calc {
fn calc(&self, x1: usize, x2: usize) -> usize;
}
#[delegate]
trait Label {
fn label(&self) -> String;
}
#[delegate]
trait Increment: Calc + Label {
fn increment(&mut self) -> usize;
}
#[derive(Default)]
struct Child {
num: usize,
}
impl Increment for Child {
fn increment(&mut self) -> usize {
self.num += 1;
self.num
}
}
impl Calc for Child {
fn calc(&self, x1: usize, x2: usize) -> usize {
x1 + x2
}
}
impl Label for Child {
fn label(&self) -> String {
String::from("add")
}
}
#[derive(Default, Delegate)]
struct Parent {
#[to(Calc, Increment, Label)]
child: Child,
}
fn main() {
let mut parent = Parent::default();
assert_eq!(parent.increment(), 1);
assert_eq!(parent.increment(), 2);
assert_eq!(parent.calc(3, 2), 5);
assert_eq!(parent.label(), "add");
}