easy_di/
service_provider.rs

1use crate::{Error, ServiceProviderExtensions};
2use std::sync::MutexGuard;
3
4type ServiceProviderResult<T> = Result<T, Error>;
5
6pub trait ServiceProvider {
7    /// Service provider's extensions container
8    fn extensions(&self) -> MutexGuard<'_, ServiceProviderExtensions>;
9
10    /// Inserts element into service provider's extensions
11    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    /// Returns Some(`T`) if value already hashed, otherwise returns None.
20    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}