From 3388f857b32cf1893d7b54582c8fd16e4965550b Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 27 Jul 2022 18:05:34 +0200 Subject: feat: implement binding singletons --- src/provider.rs | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'src/provider.rs') diff --git a/src/provider.rs b/src/provider.rs index eb5b5d8..2e832f8 100644 --- a/src/provider.rs +++ b/src/provider.rs @@ -4,14 +4,15 @@ use std::marker::PhantomData; use crate::errors::injectable::ResolveError; use crate::interfaces::any_factory::AnyFactory; use crate::interfaces::injectable::Injectable; -use crate::ptr::{FactoryPtr, TransientPtr}; +use crate::ptr::{FactoryPtr, SingletonPtr, TransientPtr}; use crate::DIContainer; extern crate error_stack; pub enum Providable { - Injectable(TransientPtr), + Transient(TransientPtr), + Singleton(SingletonPtr), #[allow(dead_code)] Factory(FactoryPtr), } @@ -24,14 +25,14 @@ pub trait IProvider ) -> error_stack::Result; } -pub struct InjectableTypeProvider +pub struct TransientTypeProvider where InjectableType: Injectable, { injectable_phantom: PhantomData, } -impl InjectableTypeProvider +impl TransientTypeProvider where InjectableType: Injectable, { @@ -43,7 +44,7 @@ where } } -impl IProvider for InjectableTypeProvider +impl IProvider for TransientTypeProvider where InjectableType: Injectable, { @@ -52,12 +53,42 @@ where di_container: &DIContainer, ) -> error_stack::Result { - Ok(Providable::Injectable(InjectableType::resolve( + Ok(Providable::Transient(InjectableType::resolve( di_container, )?)) } } +pub struct SingletonProvider +where + InjectableType: Injectable, +{ + singleton: SingletonPtr, +} + +impl SingletonProvider +where + InjectableType: Injectable, +{ + pub fn new(singleton: SingletonPtr) -> Self + { + Self { singleton } + } +} + +impl IProvider for SingletonProvider +where + InjectableType: Injectable, +{ + fn provide( + &self, + _di_container: &DIContainer, + ) -> error_stack::Result + { + Ok(Providable::Singleton(self.singleton.clone())) + } +} + #[cfg(feature = "factory")] pub struct FactoryProvider { -- cgit v1.2.3-18-g5258