use nject::{init, injectable, module, provider};
#[injectable]
#[module]
#[export(u16, 5432)]
struct DbConfigModule;
#[injectable]
#[module]
#[export(String, |port: u16| format!("postgres://localhost:{}", port))]
struct ConnectionModule;
#[injectable]
struct DbService {
connection_string: String,
}
#[derive(Debug)]
#[injectable]
struct Secret(#[inject(42)] i32);
#[injectable]
#[module]
struct SecretModule {
#[export]
secret: Secret,
}
#[injectable]
struct SecretConsumer<'a>(&'a Secret);
#[injectable]
#[provider]
struct AppProvider(#[import] DbConfigModule, #[import] ConnectionModule);
#[injectable]
#[provider]
struct SecretProvider(#[import] SecretModule);
fn main() {
let provider: AppProvider = init!(DbConfigModule, ConnectionModule);
let svc: DbService = provider.provide();
println!("[expr] Connection: {}", svc.connection_string);
assert_eq!(svc.connection_string, "postgres://localhost:5432");
init! {
let secret_provider: SecretProvider = SecretModule;
}
let consumer: SecretConsumer = secret_provider.provide();
println!("[block] Secret value: {}", consumer.0.0);
assert_eq!(consumer.0.0, 42);
}