he_di 0.2.1

Dependency Inversion / Dependency Injection / Inversion of control container for Rust
Documentation
extern crate he_di;
#[macro_use] extern crate he_di_derive;

trait Foo {
    fn get_value(&self) -> usize;
    fn set_value(&mut self, _: usize);
}

#[derive(Component)]
#[interface(Foo)]
struct FooImpl {
    value: usize,
}

impl Foo for FooImpl {
    fn get_value(&self) -> usize {
        self.value
    }

    fn set_value(&mut self, val: usize) {
        self.value = val;
    }
}

fn main() {
    let mut builder = he_di::ContainerBuilder::new();
    builder
        .register::<FooImpl>()
        .as_type::<Foo>()
        .with_named_parameter("value", 17 as usize);
    
    let mut container = builder.build().unwrap();
    
    {
        let foo : &Foo = container.resolve_ref::<Foo>().unwrap();
        assert_eq!(foo.get_value(), 17);
    }
    
    {
        let foo : &mut Foo = container.resolve_mut::<Foo>().unwrap();
        assert_eq!(foo.get_value(), 17);
        foo.set_value(99);
    }
    
    {
        let foo : Box<Foo> = container.resolve::<Foo>().unwrap(); // consume registration data, `Foo` won't be able to be resolved from this container any longer
        assert_eq!(foo.get_value(), 99);
    }
    
    {
        let foo = container.resolve_ref::<Foo>();
        assert!(foo.is_err());
    }
    
    {
        let foo = container.resolve_mut::<Foo>();
        assert!(foo.is_err());
    }
    println!("All assertions passed!");
}