shaku 0.6.1

Compile Time Dependency Injection for Rust
Documentation
use shaku::{module, Component, HasComponent, Interface};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::Arc;

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

#[derive(Component)]
#[shaku(interface = ValueService)]
struct ValueServiceImpl {
    #[shaku(default = AtomicUsize::new(17))]
    value: AtomicUsize,
}

impl ValueService for ValueServiceImpl {
    fn get_value(&self) -> usize {
        self.value.load(Ordering::SeqCst)
    }

    fn set_value(&self, val: usize) {
        self.value.store(val, Ordering::SeqCst);
    }
}

module! {
    TestModule {
        components = [ValueServiceImpl],
        providers = []
    }
}

#[test]
fn resolve_ref_get_value() {
    let module = TestModule::builder().build();
    let service: &dyn ValueService = module.resolve_ref();

    assert_eq!(service.get_value(), 17);
}

#[test]
fn resolve_ref_set_value() {
    let module = TestModule::builder().build();
    let service: &dyn ValueService = module.resolve_ref();

    service.set_value(99);
    assert_eq!(service.get_value(), 99);
}

#[test]
fn resolve_ref_set_then_resolve() {
    let module = TestModule::builder().build();

    {
        let service: &dyn ValueService = module.resolve_ref();
        service.set_value(99);
    }

    {
        let service: Arc<dyn ValueService> = module.resolve();
        assert_eq!(service.get_value(), 99);
    }
}