auto-delegate 0.1.3

Auto delegate allows you that automatic impl of traits and delegate their handling to child members.
Documentation
use auto_delegate::{delegate, Delegate};

#[delegate]
trait Calc {
    fn calc(self, x1: usize, x2: usize) -> usize;
}


#[derive(Default)]
struct CalcAdd;

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
    }
}


#[derive(Default)]
struct CalcMul;

impl Calc for CalcMul {
    fn calc(self, x1: usize, x2: usize) -> usize {
        x1 * x2
    }
}


#[derive(Default)]
struct CalcDiv;

impl Calc for CalcDiv {
    fn calc(self, x1: usize, x2: usize) -> usize {
        x1 / x2
    }
}


#[derive(Delegate)]
#[to(Calc)]
enum Calculator {
    Add(CalcAdd),
    Sub(CalcSub),
    Mul(CalcMul),
    Div(CalcDiv),
    Add2(CalcAdd),
    Sub2(CalcSub),
    Mul2(CalcMul),
    Div2(CalcDiv),
    Add3(CalcAdd),
    Sub3(CalcSub),
    Mul3(CalcMul),
    Div3(CalcDiv),
}


fn main() {
    assert_eq!(Calculator::Add(CalcAdd).calc(3, 2), 5);
    assert_eq!(Calculator::Sub(CalcSub).calc(3, 2), 1);
    assert_eq!(Calculator::Mul(CalcMul).calc(3, 2), 6);
    assert_eq!(Calculator::Div(CalcDiv).calc(6, 2), 3);

    assert_eq!(Calculator::Add2(CalcAdd).calc(3, 2), 5);
    assert_eq!(Calculator::Sub2(CalcSub).calc(3, 2), 1);
    assert_eq!(Calculator::Mul2(CalcMul).calc(3, 2), 6);
    assert_eq!(Calculator::Div2(CalcDiv).calc(6, 2), 3);

    assert_eq!(Calculator::Add3(CalcAdd).calc(3, 2), 5);
    assert_eq!(Calculator::Sub3(CalcSub).calc(3, 2), 1);
    assert_eq!(Calculator::Mul3(CalcMul).calc(3, 2), 6);
    assert_eq!(Calculator::Div3(CalcDiv).calc(6, 2), 3);
}