use std::sync::Arc;
use crate::core::{Container, Resolver};
use crate::di::ManyResolver;
use crate::di::keyed::Keyed;
pub fn resolve<R: ResolveTarget + ?Sized>() -> R::Output {
R::resolve_target()
}
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()
}
}