#![cfg(feature = "derive")]
use dependency_injector::TypedRequire;
use dependency_injector::typed::{Reg, Require, TypedBuilder, TypedContainer};
use std::sync::Arc;
#[derive(Clone)]
struct Database;
#[derive(Clone)]
struct Cache;
#[allow(dead_code)]
#[derive(Clone, TypedRequire)]
struct UserService {
#[dep]
db: Arc<Database>,
#[dep]
cache: Arc<Cache>,
}
#[allow(dead_code)]
#[derive(Clone, TypedRequire)]
struct Standalone {
counter: u64,
}
#[allow(dead_code)]
#[derive(Clone, TypedRequire)]
struct WithOptional {
#[dep]
db: Arc<Database>,
#[dep(optional)]
cache: Option<Arc<Cache>>,
}
fn assert_dependencies<S: Require<Dependencies = D>, D>() {}
fn assert_matches_registry<S: Require<Dependencies = R>, R>(_: &TypedContainer<R>) {}
#[test]
fn generates_reg_chain_for_dep_fields() {
assert_dependencies::<UserService, Reg<Database, Reg<Cache, ()>>>();
}
#[test]
fn generates_unit_for_no_dep_fields() {
assert_dependencies::<Standalone, ()>();
}
#[test]
fn excludes_optional_deps_from_required_list() {
assert_dependencies::<WithOptional, Reg<Database, ()>>();
}
#[test]
fn dependencies_match_typed_builder_registry() {
let container = TypedBuilder::new()
.singleton(Cache)
.singleton(Database)
.build();
assert_matches_registry::<UserService, _>(&container);
let _ = container.get::<Database>();
let _ = container.get::<Cache>();
}