use std::marker::PhantomData;
use std::sync::Arc;
use super::Container;
use super::DiError;
#[derive(Debug)]
pub struct Inject<T> {
inner: Arc<T>,
}
impl<T: Send + Sync + 'static> Inject<T> {
pub fn resolve(container: &Container) -> Result<Self, DiError> {
let inner = container.get::<T>()?;
Ok(Self { inner })
}
pub fn get(&self) -> &T {
&self.inner
}
pub fn arc(&self) -> Arc<T> {
Arc::clone(&self.inner)
}
}
impl<T> std::ops::Deref for Inject<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
pub trait Injectable: Sized + Send + Sync + 'static {
fn construct(container: &Container) -> Result<Self, DiError>;
}
pub struct Injector<T> {
_marker: PhantomData<T>,
}
impl<T: Send + Sync + 'static> Injector<T> {
pub fn from_container(container: &Container) -> Result<Inject<T>, DiError> {
Inject::resolve(container)
}
}