noema 0.4.0

Noema IOC and DI framework for Rust
Documentation
use std::sync::Arc;

use crate::core::{Container, Resolver};
use crate::di::ManyResolver;
use crate::di::keyed::Keyed;

/// Resolves a registered dependency. The generic type selects the mode:
///
/// | Turbofish | Return type |
/// |-----------|-------------|
/// | `MyService` | `Arc<MyService>` |
/// | `dyn Trait + Send + Sync` | `Arc<dyn Trait + Send + Sync>` |
/// | `Arc<[Arc<T>]>` | ordered slice (many) |
/// | `Keyed<K, S>` | keyed wrapper |
///
/// See `docs/di.md` in this crate for full examples.
pub fn resolve<R: ResolveTarget + ?Sized>() -> R::Output {
    R::resolve_target()
}

/// Internal trait mapping requested types to resolution output.
pub trait ResolveTarget {
    type Output;
    fn resolve_target() -> Self::Output;
}

impl<T: ?Sized + Send + Sync + 'static> ResolveTarget for T
where
    Container: Resolver<T>,
{
    type Output = Arc<T>;

    fn resolve_target() -> Arc<T> {
        Container::resolve()
    }
}

impl<T: ?Sized + Send + Sync + 'static> ResolveTarget for Arc<[Arc<T>]>
where
    Container: ManyResolver<T>,
{
    type Output = Arc<[Arc<T>]>;

    fn resolve_target() -> Arc<[Arc<T>]> {
        Container::resolve_many()
    }
}

impl<K, S: ?Sized + Send + Sync + 'static> ResolveTarget for Keyed<K, S> {
    type Output = Keyed<K, S>;

    fn resolve_target() -> Keyed<K, S> {
        Keyed::new()
    }
}