1mod provider;
2pub use provider::{ProvideResult, Provider, Resolvable, StaticProvider};
3mod error;
4pub use error::Error;
5mod resolver;
6pub use resolver::{Deferred, Resolver, ResolverBuilder, ResolverRef};
7mod helpers;
8
9pub use async_trait::async_trait;
10pub type Ref<T> = std::sync::Arc<T>;
11
12#[derive(Debug)]
13pub struct Container {
14 registry: Resolver,
15}
16
17impl Container {
18 pub fn new<F>(config: F) -> Self
19 where
20 F: FnOnce(&mut ResolverBuilder),
21 {
22 let mut builder = ResolverBuilder::new();
23
24 config(&mut builder);
25
26 Self {
27 registry: builder.finalize(),
28 }
29 }
30
31 pub fn build() -> ContainerBuilder {
32 ContainerBuilder {
33 resolve_builder: ResolverBuilder::new(),
34 }
35 }
36
37 pub async fn resolve<S>(&self) -> Result<S, Error>
38 where
39 S: Resolvable,
40 {
41 self.registry.resolve().await
42 }
43}
44
45#[derive(Debug)]
46pub struct ContainerBuilder {
47 resolve_builder: ResolverBuilder,
48}
49
50impl ContainerBuilder {
51 pub fn register<P>(&mut self, provider: P) -> &mut Self
52 where
53 P: Provider,
54 {
55 self.resolve_builder.register(provider);
56 self
57 }
58
59 pub fn finalize(self) -> Container {
60 Container {
61 registry: self.resolve_builder.finalize(),
62 }
63 }
64}