diff options
author | HampusM <hampus@hampusmat.com> | 2022-08-29 20:52:56 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-08-29 21:01:32 +0200 |
commit | 080cc42bb1da09059dbc35049a7ded0649961e0c (patch) | |
tree | 307ee564124373616022c1ba2b4d5af80845cd92 /src/provider/blocking.rs | |
parent | 6e31d8f9e46fece348f329763b39b9c6f2741c07 (diff) |
feat: implement async functionality
Diffstat (limited to 'src/provider/blocking.rs')
-rw-r--r-- | src/provider/blocking.rs | 122 |
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())) + } +} |