From 2d1a6b2d432408d74eb57e0bda3f7434617e1070 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 20 Jul 2022 14:29:45 +0200 Subject: refactor: reorganize folder hierarchy --- src/provider.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/provider.rs (limited to 'src/provider.rs') diff --git a/src/provider.rs b/src/provider.rs new file mode 100644 index 0000000..3b7e04c --- /dev/null +++ b/src/provider.rs @@ -0,0 +1,82 @@ +#![allow(clippy::module_name_repetitions)] +use std::marker::PhantomData; + +use crate::castable_factory::AnyFactory; +use crate::errors::injectable::ResolveError; +use crate::interfaces::injectable::Injectable; +use crate::ptr::{FactoryPtr, InterfacePtr}; +use crate::DIContainer; + +extern crate error_stack; + +pub enum Providable +{ + Injectable(InterfacePtr), + Factory(FactoryPtr), +} + +pub trait IProvider +{ + fn provide( + &self, + di_container: &DIContainer, + ) -> error_stack::Result; +} + +pub struct InjectableTypeProvider +where + InjectableType: Injectable, +{ + injectable_phantom: PhantomData, +} + +impl InjectableTypeProvider +where + InjectableType: Injectable, +{ + pub fn new() -> Self + { + Self { + injectable_phantom: PhantomData, + } + } +} + +impl IProvider for InjectableTypeProvider +where + InjectableType: Injectable, +{ + fn provide( + &self, + di_container: &DIContainer, + ) -> error_stack::Result + { + Ok(Providable::Injectable(InjectableType::resolve( + di_container, + )?)) + } +} + +pub struct FactoryProvider +{ + factory: FactoryPtr, +} + +impl FactoryProvider +{ + pub fn new(factory: FactoryPtr) -> Self + { + Self { factory } + } +} + +impl IProvider for FactoryProvider +{ + fn provide( + &self, + _di_container: &DIContainer, + ) -> error_stack::Result + { + Ok(Providable::Factory(self.factory.clone())) + } +} -- cgit v1.2.3-18-g5258