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
mod provider;
pub use provider::{Provider, ProvideResult, Resolvable, StaticProvider};
mod error;
pub use error::Error;
mod resolver;
pub use resolver::{Resolver, ResolverBuilder, ResolverRef, Deferred};
mod helpers;

pub use async_trait::async_trait;
pub type Ref<T> = std::sync::Arc<T>;

#[derive(Debug)]
pub struct Container {
  registry: Resolver,
}

impl Container {
  pub fn new<F>(config: F) -> Self
    where F: FnOnce(&mut ResolverBuilder)
  {
    let mut builder = ResolverBuilder::new();

    config(&mut builder);

    Self {
      registry: builder.finalize()
    }
  }

  pub async fn resolve<S>(&self) -> Result<S, Error>
    where S: Resolvable
  {
    self.registry.resolve().await
  }
}