chassis 0.2.0

Compile-time dependency injection framework
Documentation
use chassis::{injector, module};

#[derive(PartialEq, Debug)]
pub struct StringArg(String);

#[derive(PartialEq, Debug)]
pub struct IntArg(i32);

#[derive(PartialEq, Debug)]
pub struct Dummy {
    string: StringArg,
    int: IntArg,
}

#[derive(Default)]
struct DummyProvider1;

#[module]
impl DummyProvider1 {
    pub fn provide_int() -> IntArg {
        IntArg(42)
    }
}

#[derive(Default)]
struct DummyProvider2;

#[module]
impl DummyProvider2 {
    pub fn provide_string() -> StringArg {
        StringArg("Test".to_string())
    }

    pub fn provide_dummy(string: StringArg, int: IntArg) -> Dummy {
        Dummy { string, int }
    }
}

#[injector(modules = [DummyProvider1, DummyProvider2])]
pub trait DummyFactory1 {
    fn resolve_dummy(&self) -> Dummy;
}

#[injector(modules = [DummyProvider1, DummyProvider2])]
pub trait DummyFactory2 {
    fn resolve_dummy(&self) -> Dummy;
}

#[test]
fn check() {
    let injector1 = <dyn DummyFactory1>::new().unwrap();
    let injector2 = <dyn DummyFactory2>::new().unwrap();
    let dummy1 = injector1.resolve_dummy();
    let dummy2 = injector2.resolve_dummy();
    assert_eq!(dummy1, dummy2);
}