1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
use crate::{
Injector, Module, Provider, ProviderMap, RequestInfo, ServiceInfo,
};
#[derive(Default)]
pub struct InjectorBuilder {
providers: ProviderMap,
root_info: RequestInfo,
}
impl InjectorBuilder {
pub fn provide<P: Provider>(&mut self, provider: P) {
self.add_provider(Box::new(provider))
}
#[allow(clippy::missing_panics_doc)]
pub fn add_provider(&mut self, provider: Box<dyn Provider>) {
self.providers
.entry(provider.result())
.or_insert_with(|| Some(Vec::new()))
.as_mut()
.unwrap()
.push(provider)
}
pub fn remove_providers(
&mut self,
service_info: ServiceInfo,
) -> Option<Vec<Box<dyn Provider>>> {
self.providers.remove(&service_info).flatten()
}
#[must_use]
pub fn root_info(&self) -> &RequestInfo {
&self.root_info
}
#[must_use]
pub fn root_info_mut(&mut self) -> &mut RequestInfo {
&mut self.root_info
}
#[allow(clippy::missing_panics_doc)]
pub fn add_module(&mut self, module: Module) {
for (result, module_providers) in module.providers {
let mut module_providers = module_providers.unwrap();
self.providers
.entry(result)
.and_modify(|providers| {
providers.as_mut().unwrap().append(&mut module_providers)
})
.or_insert_with(|| Some(module_providers));
}
for (key, value) in module.parameters {
drop(self.root_info_mut().insert_parameter_boxed(&key, value));
}
}
#[must_use]
pub fn build(self) -> Injector {
Injector::new_from_parts(self.providers, self.root_info)
}
}