rust-dix 0.6.0

rust-dix: A Rust dependency injection framework inspired by Microsoft.Extensions.DependencyInjection
Documentation
mod common;

use rust_dix::*;
use std::sync::Arc;

#[test]
fn iprovider_root_resolves() {
    let p = ServiceCollection::new()
        .singleton(|_| Arc::new(common::MyService { value: 100 }))
        .build()
        .unwrap();
    let rp: Arc<dyn IProvider> = p;
    let any = rp.get_any(std::any::type_name::<common::MyService>()).unwrap();
    let svc: Arc<common::MyService> = Arc::clone(&*any.downcast::<Arc<common::MyService>>().unwrap());
    assert_eq!(svc.value, 100);
}

#[test]
fn iprovider_wrapped_resolves() {
    let root = ServiceCollection::new()
        .singleton(|_| Arc::new(common::MyService { value: 200 }))
        .build()
        .unwrap();
    let child = ServiceCollection::new().build().unwrap();
    let wrapper = ServiceProviderWrapper::new(child, root);
    let rp: Arc<dyn IProvider> = wrapper;
    let any = rp.get_any(std::any::type_name::<common::MyService>()).unwrap();
    let svc: Arc<common::MyService> = Arc::clone(&*any.downcast::<Arc<common::MyService>>().unwrap());
    assert_eq!(svc.value, 200);
}

#[test]
fn iprovider_get_named_any() {
    let p = ServiceCollection::new().build().unwrap();
    p.register_named("rdi_key", Arc::new(common::MyService { value: 5 }));
    let rp: Arc<dyn IProvider> = p;
    let retrieved = rp.get_named_any("rdi_key");
    assert!(retrieved.is_some());
}

#[test]
fn iprovider_register_and_remove_named() {
    let p = ServiceCollection::new().build().unwrap();
    let rp: Arc<dyn IProvider> = p;
    let svc = Arc::new(common::MyService { value: 3 });
    rp.rdi_register_named("test", svc);
    let retrieved = rp.get_named_any("test");
    assert!(retrieved.is_some());
    let down: Arc<common::MyService> = retrieved.unwrap().downcast::<common::MyService>().unwrap();
    assert_eq!(down.value, 3);
    rp.rdi_remove_named("test");
    assert!(rp.get_named_any("test").is_none());
}