use springtime_di::component_registry::conditional::{ConditionMetadata, Context};
use springtime_di::factory::ComponentFactoryBuilder;
use springtime_di::instance_provider::{ComponentInstancePtr, TypedComponentInstanceProvider};
use springtime_di::{component_alias, injectable, Component};
#[injectable]
trait TestTrait {
fn foo(&self);
}
#[derive(Component)]
struct TestDependency1;
#[component_alias]
impl TestTrait for TestDependency1 {
fn foo(&self) {
println!("Hello world from 1!");
}
}
#[derive(Component)]
#[component(condition = "can_test_dependency_2_be_registered")]
struct TestDependency2;
fn can_test_dependency_2_be_registered(
_context: &dyn Context,
_metadata: ConditionMetadata,
) -> bool {
false
}
#[component_alias]
impl TestTrait for TestDependency2 {
fn foo(&self) {
println!("Hello world from 2!");
}
}
#[derive(Component)]
struct TestComponent {
dependency: ComponentInstancePtr<dyn TestTrait + Send + Sync>,
}
impl TestComponent {
fn call_foo(&self) {
self.dependency.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();
}