he_di 0.2.1

Dependency Inversion / Dependency Injection / Inversion of control container for Rust
Documentation
#![allow(non_snake_case)]

extern crate he_di;
#[macro_use] extern crate he_di_derive;

use he_di::ContainerBuilder;
use he_di::Error as DIError;

trait Foo : ::std::fmt::Debug {
    fn foo(&self) -> String;
}

#[derive(Component, Debug)]
#[interface(Foo)]
struct FooImpl {
    value: String,
    #[inject]
    bar: Box<Bar>,
}

impl Foo for FooImpl {
    fn foo(&self) -> String {
        format!("FooImpl > foo > value = {} ; bar = {}", self.value, self.bar.bar())
    }
}

trait Bar : ::std::fmt::Debug {
    fn bar(&self) -> String;
}

#[derive(Component, Debug)]
#[interface(Bar)]
struct BarImpl {
    bar_value: String,
}

impl Bar for BarImpl {
    fn bar(&self) -> String {
        format!("BarImpl > bar > bar_value = {}", self.bar_value)
    }
}

#[test]
fn resolving_component_without_parameters_should_err() {
    let mut builder = ContainerBuilder::new();
    builder
        .register::<FooImpl>()
        .as_type::<Foo>();
    let mut container = builder.build().unwrap();
    
    let foo = container
        .resolve::<Foo>();

    assert!(foo.is_err());
    if let Err(DIError::ResolveError(err)) = foo {
        assert_eq!(err, "unable to find parameter with name or type for property value");
    } else {
        panic!("unexpected state > foo should be Err");
    }
}

#[test]
fn resolving_component_dependency_without_parameters_should_err() {
    let mut builder = ContainerBuilder::new();
    builder
        .register::<FooImpl>()
        .as_type::<Foo>()
        .with_named_parameter("value", "world is foo".to_string());

    builder
        .register::<BarImpl>()
        .as_type::<Bar>();
    let mut container = builder.build().unwrap();
    
    let foo = container
        .resolve::<Foo>();

    assert!(foo.is_err());
    if let Err(DIError::ResolveError(err)) = foo {
        assert_eq!(err, "unable to resolve component for dependency bar");
    } else {
        panic!("unexpected state > foo should be Err");
    }
}

#[test]
fn resolving_component_dependency_with_parameters_dont_err() {
    let mut builder = ContainerBuilder::new();
    builder
        .register::<FooImpl>()
        .as_type::<Foo>()
        .with_named_parameter("value", "world is foo".to_string());

    builder
        .register::<BarImpl>()
        .as_type::<Bar>();
    let mut container = builder.build().unwrap();
    
    let foo = container
        .with_named_parameter::<Bar, String>("bar_value", "world is bar".to_string())
        .resolve::<Foo>();
    assert_eq!(foo.unwrap().foo(), "FooImpl > foo > value = world is foo ; bar = BarImpl > bar > bar_value = world is bar");
}