use crate::capabilities::Capabilities; use crate::di_prelude::*; pub struct App where Caps: Capabilities, { db: Caps::Db, } impl App where Caps: Capabilities, { pub fn run(self) { println!("Running App"); println!("- db: {:?}", self.db); } } #[derive(Debug)] pub struct AppComponent(std::marker::PhantomData); impl Default for AppComponent { fn default() -> Self { Self(Default::default()) } } impl<'p, 'd, Caps> Component<'p, 'd, App, Self> for AppComponent where Caps: Capabilities, 'd: 'p, Caps: 'd, { type Requirement = Require!['p, 'd, Caps::Db]; fn component_provide( &'p self, deps: &>::Provider, ) -> App { App { db: deps.provide() } } }