From e4fdf58b42c61482741cb12e1faa24cbd50698e8 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 17 Sep 2023 23:16:09 +0200 Subject: refactor: move castable factory to directory module --- src/private/castable_factory/mod.rs | 89 ++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) (limited to 'src/private/castable_factory/mod.rs') diff --git a/src/private/castable_factory/mod.rs b/src/private/castable_factory/mod.rs index e81b842..2ac5918 100644 --- a/src/private/castable_factory/mod.rs +++ b/src/private/castable_factory/mod.rs @@ -1,4 +1,91 @@ -pub mod blocking; +use std::any::type_name; +use std::fmt::Debug; + +use crate::private::any_factory::AnyFactory; +use crate::private::factory::IFactory; +use crate::ptr::TransientPtr; #[cfg(feature = "async")] pub mod threadsafe; + +pub struct CastableFactory +where + ReturnInterface: 'static + ?Sized, + DIContainerT: 'static, +{ + func: &'static dyn Fn(&DIContainerT) -> TransientPtr, +} + +impl CastableFactory +where + ReturnInterface: 'static + ?Sized, +{ + pub fn new( + func: &'static dyn Fn(&DIContainerT) -> TransientPtr, + ) -> Self + { + Self { func } + } +} + +impl IFactory + for CastableFactory +where + ReturnInterface: 'static + ?Sized, +{ + fn call(&self, di_container: &DIContainerT) -> TransientPtr + { + (self.func)(di_container) + } +} + +impl AnyFactory + for CastableFactory +where + ReturnInterface: 'static + ?Sized, + DIContainerT: 'static, +{ +} + +impl Debug + for CastableFactory +where + ReturnInterface: 'static + ?Sized, +{ + #[cfg(not(tarpaulin_include))] + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result + { + let ret = type_name::>(); + + formatter.write_fmt(format_args!( + "CastableFactory (&DIContainer) -> {ret} {{ ... }}" + )) + } +} + +#[cfg(test)] +mod tests +{ + use super::*; + use crate::di_container::blocking::MockDIContainer; + + #[derive(Debug, PartialEq, Eq)] + struct Bacon + { + heal_amount: u32, + } + + #[test] + fn can_call() + { + let castable_factory = CastableFactory::new(&|_: &MockDIContainer| { + TransientPtr::new(Bacon { heal_amount: 27 }) + }); + + let mock_di_container = MockDIContainer::new(); + + let output = castable_factory.call(&mock_di_container); + + assert_eq!(output, TransientPtr::new(Bacon { heal_amount: 27 })); + } +} -- cgit v1.2.3-18-g5258