diff options
Diffstat (limited to 'src/castable_factory')
-rw-r--r-- | src/castable_factory/mod.rs | 93 | ||||
-rw-r--r-- | src/castable_factory/threadsafe.rs | 102 |
2 files changed, 0 insertions, 195 deletions
diff --git a/src/castable_factory/mod.rs b/src/castable_factory/mod.rs deleted file mode 100644 index 0cb2127..0000000 --- a/src/castable_factory/mod.rs +++ /dev/null @@ -1,93 +0,0 @@ -use std::any::{type_name, Any}; -use std::fmt::Debug; - -use crate::ptr::TransientPtr; - -#[cfg(feature = "async")] -pub mod threadsafe; - -/// Interface for any castable factory. -pub trait AnyCastableFactory: Any + Debug -{ - fn as_any(&self) -> &dyn Any; -} - -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 } - } - - pub fn call(&self, di_container: &DIContainerT) -> TransientPtr<ReturnInterface> - { - (self.func)(di_container) - } -} - -impl<ReturnInterface, DIContainerT> AnyCastableFactory - for CastableFactory<ReturnInterface, DIContainerT> -where - ReturnInterface: 'static + ?Sized, - DIContainerT: 'static, -{ - fn as_any(&self) -> &dyn Any - { - self - } -} - -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/castable_factory/threadsafe.rs b/src/castable_factory/threadsafe.rs deleted file mode 100644 index 8b1e66d..0000000 --- a/src/castable_factory/threadsafe.rs +++ /dev/null @@ -1,102 +0,0 @@ -use std::any::{type_name, Any}; -use std::fmt::Debug; - -use crate::castable_factory::AnyCastableFactory; -use crate::ptr::TransientPtr; - -/// Interface for any threadsafe castable factory. -pub trait AnyThreadsafeCastableFactory: AnyCastableFactory + Send + Sync + Debug {} - -pub struct ThreadsafeCastableFactory<ReturnInterface, DIContainerT> -where - DIContainerT: 'static, - ReturnInterface: 'static + ?Sized, -{ - func: &'static (dyn Fn(&DIContainerT) -> TransientPtr<ReturnInterface> + Send + Sync), -} - -impl<ReturnInterface, DIContainerT> - ThreadsafeCastableFactory<ReturnInterface, DIContainerT> -where - DIContainerT: 'static, - ReturnInterface: 'static + ?Sized, -{ - pub fn new( - func: &'static (dyn Fn(&DIContainerT) -> TransientPtr<ReturnInterface> - + Send - + Sync), - ) -> Self - { - Self { func } - } - - pub fn call(&self, di_container: &DIContainerT) -> TransientPtr<ReturnInterface> - { - (self.func)(di_container) - } -} - -impl<ReturnInterface, DIContainerT> AnyCastableFactory - for ThreadsafeCastableFactory<ReturnInterface, DIContainerT> -where - DIContainerT: 'static, - ReturnInterface: 'static + ?Sized, -{ - fn as_any(&self) -> &dyn Any - { - self - } -} - -impl<ReturnInterface, DIContainerT> AnyThreadsafeCastableFactory - for ThreadsafeCastableFactory<ReturnInterface, DIContainerT> -where - DIContainerT: 'static, - ReturnInterface: 'static + ?Sized, -{ -} - -impl<ReturnInterface, DIContainerT> Debug - for ThreadsafeCastableFactory<ReturnInterface, DIContainerT> -where - DIContainerT: 'static, - 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!( - "ThreadsafeCastableFactory (&AsyncDIContainer) -> {ret} {{ ... }}", - )) - } -} - -#[cfg(test)] -mod tests -{ - use super::*; - use crate::di_container::asynchronous::MockAsyncDIContainer; - - #[derive(Debug, PartialEq, Eq)] - struct Bacon - { - heal_amount: u32, - } - - #[test] - fn can_call() - { - let castable_factory = - ThreadsafeCastableFactory::new(&|_: &MockAsyncDIContainer| { - TransientPtr::new(Bacon { heal_amount: 27 }) - }); - - let mock_di_container = MockAsyncDIContainer::new(); - - let output = castable_factory.call(&mock_di_container); - - assert_eq!(output, TransientPtr::new(Bacon { heal_amount: 27 })); - } -} |