aboutsummaryrefslogtreecommitdiff
path: root/src/provider/blocking.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/provider/blocking.rs')
-rw-r--r--src/provider/blocking.rs122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/provider/blocking.rs b/src/provider/blocking.rs
new file mode 100644
index 0000000..13674b9
--- /dev/null
+++ b/src/provider/blocking.rs
@@ -0,0 +1,122 @@
+#![allow(clippy::module_name_repetitions)]
+use std::marker::PhantomData;
+
+use crate::errors::injectable::InjectableError;
+use crate::interfaces::injectable::Injectable;
+use crate::ptr::{SingletonPtr, TransientPtr};
+use crate::DIContainer;
+
+#[derive(strum_macros::Display, Debug)]
+pub enum Providable
+{
+ Transient(TransientPtr<dyn Injectable>),
+ Singleton(SingletonPtr<dyn Injectable>),
+ #[cfg(feature = "factory")]
+ Factory(crate::ptr::FactoryPtr<dyn crate::interfaces::any_factory::AnyFactory>),
+}
+
+pub trait IProvider
+{
+ fn provide(
+ &self,
+ di_container: &DIContainer,
+ dependency_history: Vec<&'static str>,
+ ) -> Result<Providable, InjectableError>;
+}
+
+pub struct TransientTypeProvider<InjectableType>
+where
+ InjectableType: Injectable,
+{
+ injectable_phantom: PhantomData<InjectableType>,
+}
+
+impl<InjectableType> TransientTypeProvider<InjectableType>
+where
+ InjectableType: Injectable,
+{
+ pub fn new() -> Self
+ {
+ Self {
+ injectable_phantom: PhantomData,
+ }
+ }
+}
+
+impl<InjectableType> IProvider for TransientTypeProvider<InjectableType>
+where
+ InjectableType: Injectable,
+{
+ fn provide(
+ &self,
+ di_container: &DIContainer,
+ dependency_history: Vec<&'static str>,
+ ) -> Result<Providable, InjectableError>
+ {
+ Ok(Providable::Transient(InjectableType::resolve(
+ di_container,
+ dependency_history,
+ )?))
+ }
+}
+
+pub struct SingletonProvider<InjectableType>
+where
+ InjectableType: Injectable,
+{
+ singleton: SingletonPtr<InjectableType>,
+}
+
+impl<InjectableType> SingletonProvider<InjectableType>
+where
+ InjectableType: Injectable,
+{
+ pub fn new(singleton: SingletonPtr<InjectableType>) -> Self
+ {
+ Self { singleton }
+ }
+}
+
+impl<InjectableType> IProvider for SingletonProvider<InjectableType>
+where
+ InjectableType: Injectable,
+{
+ fn provide(
+ &self,
+ _di_container: &DIContainer,
+ _dependency_history: Vec<&'static str>,
+ ) -> Result<Providable, InjectableError>
+ {
+ Ok(Providable::Singleton(self.singleton.clone()))
+ }
+}
+
+#[cfg(feature = "factory")]
+pub struct FactoryProvider
+{
+ factory: crate::ptr::FactoryPtr<dyn crate::interfaces::any_factory::AnyFactory>,
+}
+
+#[cfg(feature = "factory")]
+impl FactoryProvider
+{
+ pub fn new(
+ factory: crate::ptr::FactoryPtr<dyn crate::interfaces::any_factory::AnyFactory>,
+ ) -> Self
+ {
+ Self { factory }
+ }
+}
+
+#[cfg(feature = "factory")]
+impl IProvider for FactoryProvider
+{
+ fn provide(
+ &self,
+ _di_container: &DIContainer,
+ _dependency_history: Vec<&'static str>,
+ ) -> Result<Providable, InjectableError>
+ {
+ Ok(Providable::Factory(self.factory.clone()))
+ }
+}