#![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())) } }