use springtime_di::factory::ComponentFactoryBuilder;
use springtime_di::instance_provider::{
ComponentInstancePtr, ErrorPtr, TypedComponentInstanceProvider,
};
use springtime_di::{component_alias, injectable, Component};
use std::sync::Mutex;
#[injectable]
trait TestTrait {
fn foo(&self);
}
#[derive(Component)]
#[component(constructor = "TestDependency::new", scope = "PROTOTYPE")]
struct TestDependency {
#[component(ignore)]
some_state: Mutex<i32>,
}
#[component_alias]
impl TestTrait for TestDependency {
fn foo(&self) {
let mut some_state = self.some_state.lock().unwrap();
*some_state += 1;
println!("{}", some_state);
}
}
impl TestDependency {
fn new() -> Result<Self, ErrorPtr> {
println!("TestDependency created!");
Ok(Self {
some_state: Mutex::default(),
})
}
}
#[derive(Component)]
struct TestComponent {
dependency_1: ComponentInstancePtr<dyn TestTrait + Send + Sync>,
dependency_2: ComponentInstancePtr<dyn TestTrait + Send + Sync>,
}
impl TestComponent {
fn call_foo(&self) {
self.dependency_1.foo();
self.dependency_2.foo();
}
}
fn main() {
let mut component_factory = ComponentFactoryBuilder::new()
.expect("error initializing ComponentFactoryBuilder")
.build();
let component = component_factory
.primary_instance_typed::<TestComponent>()
.expect("error creating TestComponent");
component.call_foo();
}