async_di/
lib.rs

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}