diff options
| author | HampusM <hampus@hampusmat.com> | 2023-08-31 19:19:06 +0200 | 
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2023-08-31 19:19:06 +0200 | 
| commit | 7bed48c852a741df5a14359916faf21d90d39814 (patch) | |
| tree | 5cc94835225d356ed658cf78a99deeb1b4e730f8 /src/di_container/blocking | |
| parent | 0b4232d343e2214ead8fa62583bff2e948173ddf (diff) | |
refactor: pass around BindingOptions instead of name
Diffstat (limited to 'src/di_container/blocking')
| -rw-r--r-- | src/di_container/blocking/binding/builder.rs | 44 | ||||
| -rw-r--r-- | src/di_container/blocking/binding/scope_configurator.rs | 13 | ||||
| -rw-r--r-- | src/di_container/blocking/binding/when_configurator.rs | 9 | ||||
| -rw-r--r-- | src/di_container/blocking/mod.rs | 63 | 
4 files changed, 82 insertions, 47 deletions
diff --git a/src/di_container/blocking/binding/builder.rs b/src/di_container/blocking/binding/builder.rs index 0c323ec..577f034 100644 --- a/src/di_container/blocking/binding/builder.rs +++ b/src/di_container/blocking/binding/builder.rs @@ -9,6 +9,7 @@ use crate::di_container::blocking::binding::scope_configurator::BindingScopeConf  #[cfg(feature = "factory")]  use crate::di_container::blocking::binding::when_configurator::BindingWhenConfigurator;  use crate::di_container::blocking::IDIContainer; +use crate::di_container::BindingOptions;  use crate::errors::di_container::BindingBuilderError;  use crate::interfaces::injectable::Injectable;  use crate::util::use_double; @@ -99,7 +100,10 @@ where          Implementation: Injectable<DIContainerType>,      {          { -            if self.di_container.has_binding::<Interface>(None) { +            if self +                .di_container +                .has_binding::<Interface>(BindingOptions::new()) +            {                  return Err(BindingBuilderError::BindingAlreadyExists(type_name::<                      Interface,                  >( @@ -197,7 +201,10 @@ where      {          use crate::private::castable_factory::blocking::CastableFactory; -        if self.di_container.has_binding::<Interface>(None) { +        if self +            .di_container +            .has_binding::<Interface>(BindingOptions::new()) +        {              return Err(BindingBuilderError::BindingAlreadyExists(type_name::<                  Interface,              >())); @@ -206,7 +213,7 @@ where          let factory_impl = CastableFactory::new(factory_func);          self.di_container.set_binding::<Interface>( -            None, +            BindingOptions::new(),              Box::new(crate::provider::blocking::FactoryProvider::new(                  crate::ptr::FactoryPtr::new(factory_impl),                  false, @@ -286,7 +293,10 @@ where      {          use crate::private::castable_factory::blocking::CastableFactory; -        if self.di_container.has_binding::<Interface>(None) { +        if self +            .di_container +            .has_binding::<Interface>(BindingOptions::new()) +        {              return Err(BindingBuilderError::BindingAlreadyExists(type_name::<                  Interface,              >())); @@ -295,7 +305,7 @@ where          let factory_impl = CastableFactory::new(factory_func);          self.di_container.set_binding::<Interface>( -            None, +            BindingOptions::new(),              Box::new(crate::provider::blocking::FactoryProvider::new(                  crate::ptr::FactoryPtr::new(factory_impl),                  true, @@ -324,14 +334,14 @@ mod tests          mock_di_container              .expect_has_binding::<dyn subjects::INumber>() -            .with(eq(None)) -            .return_once(|_name| false) +            .with(eq(BindingOptions::new())) +            .return_once(|_options| false)              .once();          mock_di_container              .expect_set_binding::<dyn subjects::INumber>() -            .withf(|name, _provider| name.is_none()) -            .return_once(|_name, _provider| ()) +            .withf(|options, _provider| options.name.is_none()) +            .return_once(|_options, _provider| ())              .once();          let binding_builder = @@ -361,14 +371,14 @@ mod tests          mock_di_container              .expect_has_binding::<IUserManagerFactory>() -            .with(eq(None)) -            .return_once(|_name| false) +            .with(eq(BindingOptions::new())) +            .return_once(|_| false)              .once();          mock_di_container              .expect_set_binding::<IUserManagerFactory>() -            .withf(|name, _provider| name.is_none()) -            .return_once(|_name, _provider| ()) +            .withf(|options, _provider| options.name.is_none()) +            .return_once(|_, _provider| ())              .once();          let binding_builder = @@ -404,14 +414,14 @@ mod tests          mock_di_container              .expect_has_binding::<dyn subjects::IUserManager>() -            .with(eq(None)) -            .return_once(|_name| false) +            .with(eq(BindingOptions::new())) +            .return_once(|_| false)              .once();          mock_di_container              .expect_set_binding::<dyn subjects::IUserManager>() -            .withf(|name, _provider| name.is_none()) -            .return_once(|_name, _provider| ()) +            .withf(|options, _provider| options.name.is_none()) +            .return_once(|_, _provider| ())              .once();          let binding_builder = diff --git a/src/di_container/blocking/binding/scope_configurator.rs b/src/di_container/blocking/binding/scope_configurator.rs index 0aefa93..0fcdfdf 100644 --- a/src/di_container/blocking/binding/scope_configurator.rs +++ b/src/di_container/blocking/binding/scope_configurator.rs @@ -6,6 +6,7 @@ use std::rc::Rc;  use crate::di_container::blocking::binding::when_configurator::BindingWhenConfigurator;  use crate::di_container::blocking::IDIContainer; +use crate::di_container::BindingOptions;  use crate::errors::di_container::BindingScopeConfiguratorError;  use crate::interfaces::injectable::Injectable;  use crate::provider::blocking::{SingletonProvider, TransientTypeProvider}; @@ -81,8 +82,10 @@ where              .map_err(BindingScopeConfiguratorError::SingletonResolveFailed)?,          ); -        self.di_container -            .set_binding::<Interface>(None, Box::new(SingletonProvider::new(singleton))); +        self.di_container.set_binding::<Interface>( +            BindingOptions::new(), +            Box::new(SingletonProvider::new(singleton)), +        );          Ok(BindingWhenConfigurator::new(self.di_container))      } @@ -90,7 +93,7 @@ where      pub(crate) fn set_in_transient_scope(&self)      {          self.di_container.set_binding::<Interface>( -            None, +            BindingOptions::new(),              Box::new(TransientTypeProvider::<Implementation, DIContainerType>::new()),          );      } @@ -110,7 +113,7 @@ mod tests          di_container_mock              .expect_set_binding::<dyn subjects::IUserManager>() -            .withf(|name, _provider| name.is_none()) +            .withf(|options, _provider| options.name.is_none())              .return_once(|_name, _provider| ())              .once(); @@ -131,7 +134,7 @@ mod tests          di_container_mock              .expect_set_binding::<dyn subjects::IUserManager>() -            .withf(|name, _provider| name.is_none()) +            .withf(|options, _provider| options.name.is_none())              .return_once(|_name, _provider| ())              .once(); diff --git a/src/di_container/blocking/binding/when_configurator.rs b/src/di_container/blocking/binding/when_configurator.rs index fcef377..52b23ff 100644 --- a/src/di_container/blocking/binding/when_configurator.rs +++ b/src/di_container/blocking/binding/when_configurator.rs @@ -6,6 +6,7 @@ use std::marker::PhantomData;  use std::rc::Rc;  use crate::di_container::blocking::IDIContainer; +use crate::di_container::BindingOptions;  use crate::errors::di_container::BindingWhenConfiguratorError;  /// When configurator for a binding for type `Interface` inside a [`IDIContainer`]. @@ -45,7 +46,7 @@ where      {          let binding = self              .di_container -            .remove_binding::<Interface>(None) +            .remove_binding::<Interface>(BindingOptions::new())              .map_or_else(                  || {                      Err(BindingWhenConfiguratorError::BindingNotFound(type_name::< @@ -57,7 +58,7 @@ where              )?;          self.di_container -            .set_binding::<Interface>(Some(name), binding); +            .set_binding::<Interface>(BindingOptions::new().name(name), binding);          Ok(())      } @@ -79,13 +80,13 @@ mod tests          di_container_mock              .expect_remove_binding::<dyn subjects::INumber>() -            .with(eq(None)) +            .with(eq(BindingOptions::new()))              .return_once(|_name| Some(Box::new(MockIProvider::new())))              .once();          di_container_mock              .expect_set_binding::<dyn subjects::INumber>() -            .withf(|name, _provider| name == &Some("cool")) +            .withf(|options, _provider| options.name == Some("cool"))              .return_once(|_name, _provider| ())              .once(); diff --git a/src/di_container/blocking/mod.rs b/src/di_container/blocking/mod.rs index 5b0acc8..27ea0fb 100644 --- a/src/di_container/blocking/mod.rs +++ b/src/di_container/blocking/mod.rs @@ -210,10 +210,8 @@ impl IDIContainer for DIContainer      where          Interface: 'static + ?Sized,      { -        let binding_providable = self.get_binding_providable::<Interface>( -            binding_options.name, -            dependency_history, -        )?; +        let binding_providable = self +            .get_binding_providable::<Interface>(binding_options, dependency_history)?;          #[cfg(feature = "factory")]          return self.handle_binding_providable(binding_providable); @@ -225,33 +223,37 @@ impl IDIContainer for DIContainer  impl details::DIContainerInternals for DIContainer  { -    fn has_binding<Interface>(self: &Rc<Self>, name: Option<&'static str>) -> bool +    fn has_binding<Interface>(self: &Rc<Self>, binding_options: BindingOptions) -> bool      where          Interface: ?Sized + 'static,      { -        self.binding_storage.borrow().has::<Interface>(name) +        self.binding_storage +            .borrow() +            .has::<Interface>(binding_options)      }      fn set_binding<Interface>(          self: &Rc<Self>, -        name: Option<&'static str>, +        binding_options: BindingOptions<'static>,          provider: Box<dyn IProvider<Self>>,      ) where          Interface: 'static + ?Sized,      {          self.binding_storage              .borrow_mut() -            .set::<Interface>(name, provider); +            .set::<Interface>(binding_options, provider);      }      fn remove_binding<Interface>(          self: &Rc<Self>, -        name: Option<&'static str>, +        binding_options: BindingOptions<'static>,      ) -> Option<Box<dyn IProvider<Self>>>      where          Interface: 'static + ?Sized,      { -        self.binding_storage.borrow_mut().remove::<Interface>(name) +        self.binding_storage +            .borrow_mut() +            .remove::<Interface>(binding_options)      }  } @@ -316,15 +318,17 @@ impl DIContainer      fn get_binding_providable<Interface>(          self: &Rc<Self>, -        name: Option<&str>, +        binding_options: BindingOptions,          dependency_history: DependencyHistory,      ) -> Result<Providable<Self>, DIContainerError>      where          Interface: 'static + ?Sized,      { +        let name = binding_options.name; +          self.binding_storage              .borrow() -            .get::<Interface>(name) +            .get::<Interface>(binding_options)              .map_or_else(                  || {                      Err(DIContainerError::BindingNotFound { @@ -346,24 +350,29 @@ pub(crate) mod details  {      use std::rc::Rc; +    use crate::di_container::blocking::BindingOptionsWithLt; +    use crate::di_container::BindingOptions;      use crate::provider::blocking::IProvider;      pub trait DIContainerInternals      { -        fn has_binding<Interface>(self: &Rc<Self>, name: Option<&'static str>) -> bool +        fn has_binding<Interface>( +            self: &Rc<Self>, +            binding_options: BindingOptionsWithLt, +        ) -> bool          where              Interface: ?Sized + 'static;          fn set_binding<Interface>(              self: &Rc<Self>, -            name: Option<&'static str>, +            binding_options: BindingOptions<'static>,              provider: Box<dyn IProvider<Self>>,          ) where              Interface: 'static + ?Sized;          fn remove_binding<Interface>(              self: &Rc<Self>, -            name: Option<&'static str>, +            binding_options: BindingOptions<'static>,          ) -> Option<Box<dyn IProvider<Self>>>          where              Interface: 'static + ?Sized; @@ -395,7 +404,10 @@ mod tests          di_container              .binding_storage              .borrow_mut() -            .set::<dyn subjects::IUserManager>(None, Box::new(mock_provider)); +            .set::<dyn subjects::IUserManager>( +                BindingOptions::new(), +                Box::new(mock_provider), +            );          di_container              .get::<dyn subjects::IUserManager>()? @@ -420,7 +432,10 @@ mod tests          di_container              .binding_storage              .borrow_mut() -            .set::<dyn subjects::IUserManager>(Some("special"), Box::new(mock_provider)); +            .set::<dyn subjects::IUserManager>( +                BindingOptions::new().name("special"), +                Box::new(mock_provider), +            );          di_container              .get_named::<dyn subjects::IUserManager>("special")? @@ -447,7 +462,7 @@ mod tests          di_container              .binding_storage              .borrow_mut() -            .set::<dyn subjects::INumber>(None, Box::new(mock_provider)); +            .set::<dyn subjects::INumber>(BindingOptions::new(), Box::new(mock_provider));          let first_number_rc = di_container.get::<dyn subjects::INumber>()?.singleton()?; @@ -479,7 +494,10 @@ mod tests          di_container              .binding_storage              .borrow_mut() -            .set::<dyn subjects::INumber>(Some("cool"), Box::new(mock_provider)); +            .set::<dyn subjects::INumber>( +                BindingOptions::new().name("cool"), +                Box::new(mock_provider), +            );          let first_number_rc = di_container              .get_named::<dyn subjects::INumber>("cool")? @@ -567,7 +585,7 @@ mod tests          di_container              .binding_storage              .borrow_mut() -            .set::<IUserManagerFactory>(None, Box::new(mock_provider)); +            .set::<IUserManagerFactory>(BindingOptions::new(), Box::new(mock_provider));          di_container.get::<IUserManagerFactory>()?.factory()?; @@ -645,7 +663,10 @@ mod tests          di_container              .binding_storage              .borrow_mut() -            .set::<IUserManagerFactory>(Some("special"), Box::new(mock_provider)); +            .set::<IUserManagerFactory>( +                BindingOptions::new().name("special"), +                Box::new(mock_provider), +            );          di_container              .get_named::<IUserManagerFactory>("special")?  | 
