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 })); +    } +}  | 
