chassis 0.2.0

Compile-time dependency injection framework
Documentation
pub struct Greeter {
    message: String,
    count: i32,
}

impl Greeter {
    pub fn new(message: String, count: i32) -> Self {
        Self { message, count }
    }

    pub fn say_hello(&self) {
        for _ in 0..self.count {
            println!("{}", self.message);
        }
    }
}

#[derive(Default)]
pub struct DemoModule;

pub struct Message(String);
pub struct Count(i32);

#[chassis::module]
impl DemoModule {
    pub fn provide_count() -> Count {
        Count(5)
    }

    pub fn provide_message() -> Message {
        Message("Hello World".to_string())
    }

    pub fn provide_greeter(message: Message, count: Count) -> Greeter {
        Greeter::new(message.0, count.0)
    }
}

#[chassis::injector(modules = [DemoModule])]
pub trait DemoComponent {
    fn resolve_greeter(&self) -> Greeter;
}

fn main() {
    let injector = <dyn DemoComponent>::new().expect("DI container should be consistent");
    let greeter = injector.resolve_greeter();
    greeter.say_hello();
}