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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
use std::any::TypeId; use std::rc::Rc; use std::sync::Arc; use crate::inject::Inject; use crate::Container; use crate::InjectError; pub trait Provider { type ProvidedType: 'static; fn provide(&self, container: &Container) -> Result<Self::ProvidedType, InjectError>; fn id(&self) -> TypeId { TypeId::of::<Self::ProvidedType>() } } impl<T: ?Sized + 'static> Provider for Arc<T> { type ProvidedType = Self; fn provide(&self, container: &Container) -> Result<Self::ProvidedType, InjectError> { Ok(Arc::clone(&self)) } } impl<F, T: Inject> Provider for F where F: Fn(&Container) -> Result<T, InjectError>, { type ProvidedType = T; fn provide(&self, container: &Container) -> Result<Self::ProvidedType, InjectError> { self(container) } } pub trait RefProvider { type ProvidedRef: 'static; fn provide<'a>( &'a self, container: &'a Container, ) -> Result<&'a Self::ProvidedRef, InjectError>; fn id(&self) -> TypeId { TypeId::of::<&Self::ProvidedRef>() } } impl<T: Inject> RefProvider for Arc<T> { type ProvidedRef = T; fn provide<'a>(&'a self, _: &'a Container) -> Result<&'a T, InjectError> { Ok(&self) } } impl<T: Inject> RefProvider for Rc<T> { type ProvidedRef = T; fn provide<'a>(&'a self, _: &'a Container) -> Result<&'a T, InjectError> { Ok(&self) } } impl<T: Inject> RefProvider for Box<T> { type ProvidedRef = T; fn provide<'a>(&'a self, _: &'a Container) -> Result<&'a T, InjectError> { Ok(&self) } }