use syrette::errors::di_container::DIContainerError; use syrette::{injectable, DIContainer}; trait IDog { fn woof(&self); } struct Dog {} #[injectable(IDog)] impl Dog { fn new() -> Self { Self {} } } impl IDog for Dog { fn woof(&self) { println!("Woof!"); } } trait ICat { fn meow(&self); } struct Cat {} #[injectable(ICat)] impl Cat { fn new() -> Self { Self {} } } impl ICat for Cat { fn meow(&self) { println!("Meow!"); } } trait ICow { fn moo(&self); } trait IHuman { fn make_pets_make_sounds(&self); } struct Human { _dog: Box, _cat: Box, } #[injectable(IHuman)] impl Human { fn new(dog: Box, cat: Box) -> Self { Self { _dog: dog, _cat: cat, } } } impl IHuman for Human { fn make_pets_make_sounds(&self) { println!("Hi doggy!"); self._dog.woof(); println!("Hi kitty!"); self._cat.meow(); } } fn main() -> error_stack::Result<(), DIContainerError> { println!("Hello, world!"); let mut di_container: DIContainer = DIContainer::new(); di_container.bind::().to::(); di_container.bind::().to::(); di_container.bind::().to::(); let dog = di_container.get::()?; dog.woof(); let human = di_container.get::()?; human.make_pets_make_sounds(); Ok(()) }