diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/di_container/blocking/binding/builder.rs | 4 | ||||
-rw-r--r-- | src/di_container/blocking/mod.rs | 4 | ||||
-rw-r--r-- | src/private/castable_factory/blocking.rs | 88 | ||||
-rw-r--r-- | src/private/castable_factory/mod.rs | 89 |
4 files changed, 92 insertions, 93 deletions
diff --git a/src/di_container/blocking/binding/builder.rs b/src/di_container/blocking/binding/builder.rs index 8eebcc0..6f873d0 100644 --- a/src/di_container/blocking/binding/builder.rs +++ b/src/di_container/blocking/binding/builder.rs @@ -183,7 +183,7 @@ where Interface: Fn<Args, Output = crate::ptr::TransientPtr<Return>>, Func: Fn(&DIContainer) -> Box<Interface>, { - use crate::private::castable_factory::blocking::CastableFactory; + use crate::private::castable_factory::CastableFactory; if self .di_container @@ -271,7 +271,7 @@ where dyn Fn<(), Output = crate::ptr::TransientPtr<Return>>, >, { - use crate::private::castable_factory::blocking::CastableFactory; + use crate::private::castable_factory::CastableFactory; if self .di_container diff --git a/src/di_container/blocking/mod.rs b/src/di_container/blocking/mod.rs index a38b5da..69efe9a 100644 --- a/src/di_container/blocking/mod.rs +++ b/src/di_container/blocking/mod.rs @@ -445,7 +445,7 @@ mod tests #[cfg(feature = "factory")] fn can_get_factory() -> Result<(), Box<dyn Error>> { - use crate::private::castable_factory::blocking::CastableFactory; + use crate::private::castable_factory::CastableFactory; use crate::ptr::FactoryPtr; trait IUserManager @@ -522,7 +522,7 @@ mod tests #[cfg(feature = "factory")] fn can_get_factory_named() -> Result<(), Box<dyn Error>> { - use crate::private::castable_factory::blocking::CastableFactory; + use crate::private::castable_factory::CastableFactory; use crate::ptr::FactoryPtr; trait IUserManager diff --git a/src/private/castable_factory/blocking.rs b/src/private/castable_factory/blocking.rs deleted file mode 100644 index a28ce71..0000000 --- a/src/private/castable_factory/blocking.rs +++ /dev/null @@ -1,88 +0,0 @@ -use std::any::type_name; -use std::fmt::Debug; - -use crate::private::any_factory::AnyFactory; -use crate::private::factory::IFactory; -use crate::ptr::TransientPtr; - -pub struct CastableFactory<ReturnInterface, DIContainerT> -where - ReturnInterface: 'static + ?Sized, - DIContainerT: 'static, -{ - func: &'static dyn Fn(&DIContainerT) -> TransientPtr<ReturnInterface>, -} - -impl<ReturnInterface, DIContainerT> CastableFactory<ReturnInterface, DIContainerT> -where - ReturnInterface: 'static + ?Sized, -{ - pub fn new( - func: &'static dyn Fn(&DIContainerT) -> TransientPtr<ReturnInterface>, - ) -> Self - { - Self { func } - } -} - -impl<ReturnInterface, DIContainerT> IFactory<ReturnInterface, DIContainerT> - for CastableFactory<ReturnInterface, DIContainerT> -where - ReturnInterface: 'static + ?Sized, -{ - fn call(&self, di_container: &DIContainerT) -> TransientPtr<ReturnInterface> - { - (self.func)(di_container) - } -} - -impl<ReturnInterface, DIContainerT> AnyFactory - for CastableFactory<ReturnInterface, DIContainerT> -where - ReturnInterface: 'static + ?Sized, - DIContainerT: 'static, -{ -} - -impl<ReturnInterface, DIContainerT> Debug - for CastableFactory<ReturnInterface, DIContainerT> -where - ReturnInterface: 'static + ?Sized, -{ - #[cfg(not(tarpaulin_include))] - fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result - { - let ret = type_name::<TransientPtr<ReturnInterface>>(); - - 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 })); - } -} 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<ReturnInterface, DIContainerT> +where + ReturnInterface: 'static + ?Sized, + DIContainerT: 'static, +{ + func: &'static dyn Fn(&DIContainerT) -> TransientPtr<ReturnInterface>, +} + +impl<ReturnInterface, DIContainerT> CastableFactory<ReturnInterface, DIContainerT> +where + ReturnInterface: 'static + ?Sized, +{ + pub fn new( + func: &'static dyn Fn(&DIContainerT) -> TransientPtr<ReturnInterface>, + ) -> Self + { + Self { func } + } +} + +impl<ReturnInterface, DIContainerT> IFactory<ReturnInterface, DIContainerT> + for CastableFactory<ReturnInterface, DIContainerT> +where + ReturnInterface: 'static + ?Sized, +{ + fn call(&self, di_container: &DIContainerT) -> TransientPtr<ReturnInterface> + { + (self.func)(di_container) + } +} + +impl<ReturnInterface, DIContainerT> AnyFactory + for CastableFactory<ReturnInterface, DIContainerT> +where + ReturnInterface: 'static + ?Sized, + DIContainerT: 'static, +{ +} + +impl<ReturnInterface, DIContainerT> Debug + for CastableFactory<ReturnInterface, DIContainerT> +where + ReturnInterface: 'static + ?Sized, +{ + #[cfg(not(tarpaulin_include))] + fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result + { + let ret = type_name::<TransientPtr<ReturnInterface>>(); + + 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 })); + } +} |