easy_di/
service_provider.rs1use crate::{Error, ServiceProviderExtensions};
2use std::sync::MutexGuard;
3
4type ServiceProviderResult<T> = Result<T, Error>;
5
6pub trait ServiceProvider {
7 fn extensions(&self) -> MutexGuard<'_, ServiceProviderExtensions>;
9
10 fn inject<T>(&mut self, elem: T)
12 where
13 T: 'static + Send + Sync + Clone,
14 Self: Sized,
15 {
16 self.extensions().insert(elem);
17 }
18
19 fn find<T>(&self) -> ServiceProviderResult<T>
21 where
22 T: 'static + Send + Sync + Clone,
23 {
24 let ext = self.extensions();
25 let maybe_wrapper = ext.get::<T>();
26 match maybe_wrapper {
27 Some(service) => Ok(service.clone()),
28 None => Err(Error::InjectLookupError(format!(
29 "{:?}",
30 std::any::type_name::<T>()
31 ))),
32 }
33 }
34
35 fn count(&self) -> usize {
36 self.extensions().len()
37 }
38}