shaku 0.6.3

Compile Time Dependency Injection for Rust
Documentation
use shaku::{module, Component, HasComponent, HasProvider, Interface, Provider};

#[derive(Debug, PartialEq, Eq)]
struct ForcedValue(usize);

impl Default for ForcedValue {
    fn default() -> Self {
        Self(31)
    }
}

trait ComponentTrait: Interface {
    fn value(&self) -> usize;
}

#[derive(Component)]
#[shaku(interface = ComponentTrait)]
struct ComponentImpl {
    #[shaku(force_default)]
    value: ForcedValue,
}

impl ComponentTrait for ComponentImpl {
    fn value(&self) -> usize {
        self.value.0
    }
}

trait ProviderTrait {
    fn value(&self) -> usize;
}

#[derive(Provider)]
#[shaku(interface = ProviderTrait)]
struct ProviderImpl {
    #[shaku(force_default)]
    value: ForcedValue,
}

impl ProviderTrait for ProviderImpl {
    fn value(&self) -> usize {
        self.value.0
    }
}

module! {
    TestModule {
        components = [ComponentImpl],
        providers = [ProviderImpl]
    }
}

#[test]
fn component_force_default_field_is_not_parameter() {
    let _parameters = ComponentImplParameters {};
}

#[test]
fn component_force_default_field_uses_default() {
    let module = TestModule::builder().build();
    let component: &dyn ComponentTrait = module.resolve_ref();

    assert_eq!(component.value(), 31);
}

#[test]
fn provider_force_default_field_uses_default() {
    let module = TestModule::builder().build();
    let provider: Box<dyn ProviderTrait> = module.provide().unwrap();

    assert_eq!(provider.value(), 31);
}