aboutsummaryrefslogtreecommitdiff
path: root/src/di_container/asynchronous/binding
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2023-09-16 14:28:50 +0200
committerHampusM <hampus@hampusmat.com>2023-09-16 15:29:28 +0200
commitda7426ccb4aae87b322a884c31c6e5136c40927f (patch)
tree1da86babda80643b86aea2b9cbff112d544c984e /src/di_container/asynchronous/binding
parent816650ee587be3c3c4378287c422d269703b7ad8 (diff)
refactor!: remove async DI container interface
BREAKING CHANGE: IAsyncDIContainer have been removed and multiple structs no longer take a DI container generic parameter
Diffstat (limited to 'src/di_container/asynchronous/binding')
-rw-r--r--src/di_container/asynchronous/binding/builder.rs142
-rw-r--r--src/di_container/asynchronous/binding/scope_configurator.rs47
-rw-r--r--src/di_container/asynchronous/binding/when_configurator.rs29
3 files changed, 82 insertions, 136 deletions
diff --git a/src/di_container/asynchronous/binding/builder.rs b/src/di_container/asynchronous/binding/builder.rs
index 83a1efb..7050847 100644
--- a/src/di_container/asynchronous/binding/builder.rs
+++ b/src/di_container/asynchronous/binding/builder.rs
@@ -1,6 +1,4 @@
-//! Binding builder for types inside of a [`IAsyncDIContainer`].
-//!
-//! [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
+//! Binding builder for types inside of a [`AsyncDIContainer`].
use std::any::type_name;
use std::marker::PhantomData;
use std::sync::Arc;
@@ -8,41 +6,37 @@ use std::sync::Arc;
use crate::di_container::asynchronous::binding::scope_configurator::AsyncBindingScopeConfigurator;
#[cfg(feature = "factory")]
use crate::di_container::asynchronous::binding::when_configurator::AsyncBindingWhenConfigurator;
-use crate::di_container::asynchronous::IAsyncDIContainer;
use crate::di_container::BindingOptions;
use crate::errors::async_di_container::AsyncBindingBuilderError;
use crate::interfaces::async_injectable::AsyncInjectable;
use crate::util::use_double;
use_double!(crate::dependency_history::DependencyHistory);
+use_double!(crate::di_container::asynchronous::AsyncDIContainer);
/// Alias for a threadsafe boxed function.
#[cfg(feature = "factory")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "factory")))]
pub type BoxFn<Args, Return> = Box<(dyn Fn<Args, Output = Return> + Send + Sync)>;
-/// Binding builder for type `Interface` inside a [`IAsyncDIContainer`].
-///
-/// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
+/// Binding builder for type `Interface` inside a [`AsyncDIContainer`].
#[must_use = "No binding will be created if you don't use the binding builder"]
-pub struct AsyncBindingBuilder<Interface, DIContainerType>
+pub struct AsyncBindingBuilder<Interface>
where
Interface: 'static + ?Sized + Send + Sync,
- DIContainerType: IAsyncDIContainer,
{
- di_container: Arc<DIContainerType>,
+ di_container: Arc<AsyncDIContainer>,
dependency_history_factory: fn() -> DependencyHistory,
interface_phantom: PhantomData<Interface>,
}
-impl<Interface, DIContainerType> AsyncBindingBuilder<Interface, DIContainerType>
+impl<Interface> AsyncBindingBuilder<Interface>
where
Interface: 'static + ?Sized + Send + Sync,
- DIContainerType: IAsyncDIContainer,
{
pub(crate) fn new(
- di_container: Arc<DIContainerType>,
+ di_container: Arc<AsyncDIContainer>,
dependency_history_factory: fn() -> DependencyHistory,
) -> Self
{
@@ -54,13 +48,13 @@ where
}
/// Creates a binding of type `Interface` to type `Implementation` inside of the
- /// associated [`IAsyncDIContainer`].
+ /// associated [`AsyncDIContainer`].
///
/// The scope of the binding is transient. But that can be changed by using the
/// returned [`AsyncBindingScopeConfigurator`]
///
/// # Errors
- /// Will return Err if the associated [`IAsyncDIContainer`] already have a binding for
+ /// Will return Err if the associated [`AsyncDIContainer`] already have a binding for
/// the interface.
///
/// # Examples
@@ -94,16 +88,14 @@ where
/// # Ok(())
/// # }
/// ```
- ///
- /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
pub async fn to<Implementation>(
self,
) -> Result<
- AsyncBindingScopeConfigurator<Interface, Implementation, DIContainerType>,
+ AsyncBindingScopeConfigurator<Interface, Implementation>,
AsyncBindingBuilderError,
>
where
- Implementation: AsyncInjectable<DIContainerType>,
+ Implementation: AsyncInjectable<AsyncDIContainer>,
{
if self
.di_container
@@ -127,10 +119,10 @@ where
}
/// Creates a binding of factory type `Interface` to a factory inside of the
- /// associated [`IAsyncDIContainer`].
+ /// associated [`AsyncDIContainer`].
///
/// # Errors
- /// Will return Err if the associated [`IAsyncDIContainer`] already have a binding
+ /// Will return Err if the associated [`AsyncDIContainer`] already have a binding
/// for the interface.
///
/// # Examples
@@ -173,23 +165,18 @@ where
/// # Ok(())
/// # }
/// ```
- ///
- /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
#[cfg(feature = "factory")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "factory")))]
pub async fn to_factory<Args, Return, FactoryFunc>(
self,
factory_func: &'static FactoryFunc,
- ) -> Result<
- AsyncBindingWhenConfigurator<Interface, DIContainerType>,
- AsyncBindingBuilderError,
- >
+ ) -> Result<AsyncBindingWhenConfigurator<Interface>, AsyncBindingBuilderError>
where
Args: std::marker::Tuple + 'static,
Return: 'static + ?Sized,
Interface: Fn<Args, Output = Return> + Send + Sync,
FactoryFunc:
- Fn<(Arc<DIContainerType>,), Output = BoxFn<Args, Return>> + Send + Sync,
+ Fn<(Arc<AsyncDIContainer>,), Output = BoxFn<Args, Return>> + Send + Sync,
{
use crate::private::castable_factory::threadsafe::ThreadsafeCastableFactory;
use crate::provider::r#async::AsyncFactoryVariant;
@@ -221,10 +208,10 @@ where
}
/// Creates a binding of factory type `Interface` to a async factory inside of the
- /// associated [`IAsyncDIContainer`].
+ /// associated [`AsyncDIContainer`].
///
/// # Errors
- /// Will return Err if the associated [`IAsyncDIContainer`] already have a binding
+ /// Will return Err if the associated [`AsyncDIContainer`] already have a binding
/// for the interface.
///
/// # Examples
@@ -276,24 +263,19 @@ where
/// # Ok(())
/// # }
/// ```
- ///
- /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
#[cfg(feature = "factory")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "factory")))]
pub async fn to_async_factory<Args, Return, FactoryFunc>(
self,
factory_func: &'static FactoryFunc,
- ) -> Result<
- AsyncBindingWhenConfigurator<Interface, DIContainerType>,
- AsyncBindingBuilderError,
- >
+ ) -> Result<AsyncBindingWhenConfigurator<Interface>, AsyncBindingBuilderError>
where
Args: std::marker::Tuple + 'static,
Return: 'static + ?Sized,
Interface:
Fn<Args, Output = crate::future::BoxFuture<'static, Return>> + Send + Sync,
FactoryFunc: Fn<
- (Arc<DIContainerType>,),
+ (Arc<AsyncDIContainer>,),
Output = BoxFn<Args, crate::future::BoxFuture<'static, Return>>,
> + Send
+ Sync,
@@ -328,10 +310,10 @@ where
}
/// Creates a binding of type `Interface` to a factory that takes no arguments
- /// inside of the associated [`IAsyncDIContainer`].
+ /// inside of the associated [`AsyncDIContainer`].
///
/// # Errors
- /// Will return Err if the associated [`IAsyncDIContainer`] already have a binding
+ /// Will return Err if the associated [`AsyncDIContainer`] already have a binding
/// for the interface.
///
/// # Examples
@@ -373,21 +355,16 @@ where
/// # Ok(())
/// # }
/// ```
- ///
- /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
#[cfg(feature = "factory")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "factory")))]
pub async fn to_default_factory<Return, FactoryFunc>(
self,
factory_func: &'static FactoryFunc,
- ) -> Result<
- AsyncBindingWhenConfigurator<Interface, DIContainerType>,
- AsyncBindingBuilderError,
- >
+ ) -> Result<AsyncBindingWhenConfigurator<Interface>, AsyncBindingBuilderError>
where
Return: 'static + ?Sized,
FactoryFunc: Fn<
- (Arc<DIContainerType>,),
+ (Arc<AsyncDIContainer>,),
Output = BoxFn<(), crate::ptr::TransientPtr<Return>>,
> + Send
+ Sync,
@@ -422,10 +399,10 @@ where
}
/// Creates a binding of factory type `Interface` to a async factory inside of the
- /// associated [`IAsyncDIContainer`].
+ /// associated [`AsyncDIContainer`].
///
/// # Errors
- /// Will return Err if the associated [`IAsyncDIContainer`] already have a binding
+ /// Will return Err if the associated [`AsyncDIContainer`] already have a binding
/// for the interface.
///
/// # Examples
@@ -472,21 +449,16 @@ where
/// # Ok(())
/// # }
/// ```
- ///
- /// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
#[cfg(feature = "factory")]
#[cfg_attr(doc_cfg, doc(cfg(feature = "factory")))]
pub async fn to_async_default_factory<Return, FactoryFunc>(
self,
factory_func: &'static FactoryFunc,
- ) -> Result<
- AsyncBindingWhenConfigurator<Interface, DIContainerType>,
- AsyncBindingBuilderError,
- >
+ ) -> Result<AsyncBindingWhenConfigurator<Interface>, AsyncBindingBuilderError>
where
Return: 'static + ?Sized,
FactoryFunc: Fn<
- (Arc<DIContainerType>,),
+ (Arc<AsyncDIContainer>,),
Output = BoxFn<(), crate::future::BoxFuture<'static, Return>>,
> + Send
+ Sync,
@@ -530,13 +502,13 @@ mod tests
use super::*;
use crate::dependency_history::MockDependencyHistory;
- use crate::test_utils::{mocks, subjects_async};
+ use crate::di_container::asynchronous::MockAsyncDIContainer;
+ use crate::test_utils::subjects_async;
#[tokio::test]
async fn can_bind_to() -> Result<(), Box<dyn Error>>
{
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_has_binding::<dyn subjects_async::IUserManager>()
@@ -551,10 +523,10 @@ mod tests
.once();
let binding_builder =
- AsyncBindingBuilder::<
- dyn subjects_async::IUserManager,
- mocks::async_di_container::MockAsyncDIContainer,
- >::new(Arc::new(di_container_mock), MockDependencyHistory::new);
+ AsyncBindingBuilder::<dyn subjects_async::IUserManager>::new(
+ Arc::new(di_container_mock),
+ MockDependencyHistory::new,
+ );
binding_builder.to::<subjects_async::UserManager>().await?;
@@ -578,8 +550,7 @@ mod tests
+ Send
+ Sync;
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_has_binding::<IUserManagerFactory>()
@@ -593,11 +564,10 @@ mod tests
.return_once(|_name, _provider| ())
.once();
- let binding_builder =
- AsyncBindingBuilder::<
- IUserManagerFactory,
- mocks::async_di_container::MockAsyncDIContainer,
- >::new(Arc::new(di_container_mock), MockDependencyHistory::new);
+ let binding_builder = AsyncBindingBuilder::<IUserManagerFactory>::new(
+ Arc::new(di_container_mock),
+ MockDependencyHistory::new,
+ );
binding_builder
.to_factory(&|_| {
@@ -629,8 +599,7 @@ mod tests
TransientPtr<dyn subjects_async::IUserManager>
> + Send + Sync;
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_has_binding::<IUserManagerFactory>()
@@ -644,11 +613,10 @@ mod tests
.return_once(|_name, _provider| ())
.once();
- let binding_builder =
- AsyncBindingBuilder::<
- IUserManagerFactory,
- mocks::async_di_container::MockAsyncDIContainer,
- >::new(Arc::new(di_container_mock), MockDependencyHistory::new);
+ let binding_builder = AsyncBindingBuilder::<IUserManagerFactory>::new(
+ Arc::new(di_container_mock),
+ MockDependencyHistory::new,
+ );
binding_builder
.to_async_factory(&|_| {
@@ -675,8 +643,7 @@ mod tests
declare_default_factory!(dyn subjects_async::IUserManager);
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_has_binding::<dyn subjects_async::IUserManager>()
@@ -691,10 +658,10 @@ mod tests
.once();
let binding_builder =
- AsyncBindingBuilder::<
- dyn subjects_async::IUserManager,
- mocks::async_di_container::MockAsyncDIContainer,
- >::new(Arc::new(di_container_mock), MockDependencyHistory::new);
+ AsyncBindingBuilder::<dyn subjects_async::IUserManager>::new(
+ Arc::new(di_container_mock),
+ MockDependencyHistory::new,
+ );
binding_builder
.to_default_factory(&|_| {
@@ -722,8 +689,7 @@ mod tests
declare_default_factory!(dyn subjects_async::IUserManager, async = true);
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_has_binding::<dyn subjects_async::IUserManager>()
@@ -738,10 +704,10 @@ mod tests
.once();
let binding_builder =
- AsyncBindingBuilder::<
- dyn subjects_async::IUserManager,
- mocks::async_di_container::MockAsyncDIContainer,
- >::new(Arc::new(di_container_mock), MockDependencyHistory::new);
+ AsyncBindingBuilder::<dyn subjects_async::IUserManager>::new(
+ Arc::new(di_container_mock),
+ MockDependencyHistory::new,
+ );
binding_builder
.to_async_default_factory(&|_| {
diff --git a/src/di_container/asynchronous/binding/scope_configurator.rs b/src/di_container/asynchronous/binding/scope_configurator.rs
index f10bb48..3557202 100644
--- a/src/di_container/asynchronous/binding/scope_configurator.rs
+++ b/src/di_container/asynchronous/binding/scope_configurator.rs
@@ -1,11 +1,8 @@
-//! Scope configurator for a binding for types inside of a [`IAsyncDIContainer`].
-//!
-//! [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
+//! Scope configurator for a binding for types inside of a [`AsyncDIContainer`].
use std::marker::PhantomData;
use std::sync::Arc;
use crate::di_container::asynchronous::binding::when_configurator::AsyncBindingWhenConfigurator;
-use crate::di_container::asynchronous::IAsyncDIContainer;
use crate::di_container::BindingOptions;
use crate::errors::async_di_container::AsyncBindingScopeConfiguratorError;
use crate::interfaces::async_injectable::AsyncInjectable;
@@ -14,32 +11,28 @@ use crate::ptr::ThreadsafeSingletonPtr;
use crate::util::use_double;
use_double!(crate::dependency_history::DependencyHistory);
+use_double!(crate::di_container::asynchronous::AsyncDIContainer);
-/// Scope configurator for a binding for type `Interface` inside a [`IAsyncDIContainer`].
-///
-/// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
-pub struct AsyncBindingScopeConfigurator<Interface, Implementation, DIContainerType>
+/// Scope configurator for a binding for type `Interface` inside a [`AsyncDIContainer`].
+pub struct AsyncBindingScopeConfigurator<Interface, Implementation>
where
Interface: 'static + ?Sized + Send + Sync,
- Implementation: AsyncInjectable<DIContainerType>,
- DIContainerType: IAsyncDIContainer,
+ Implementation: AsyncInjectable<AsyncDIContainer>,
{
- di_container: Arc<DIContainerType>,
+ di_container: Arc<AsyncDIContainer>,
dependency_history_factory: fn() -> DependencyHistory,
interface_phantom: PhantomData<Interface>,
implementation_phantom: PhantomData<Implementation>,
}
-impl<Interface, Implementation, DIContainerType>
- AsyncBindingScopeConfigurator<Interface, Implementation, DIContainerType>
+impl<Interface, Implementation> AsyncBindingScopeConfigurator<Interface, Implementation>
where
Interface: 'static + ?Sized + Send + Sync,
- Implementation: AsyncInjectable<DIContainerType>,
- DIContainerType: IAsyncDIContainer,
+ Implementation: AsyncInjectable<AsyncDIContainer>,
{
pub(crate) fn new(
- di_container: Arc<DIContainerType>,
+ di_container: Arc<AsyncDIContainer>,
dependency_history_factory: fn() -> DependencyHistory,
) -> Self
{
@@ -54,9 +47,7 @@ where
/// Configures the binding to be in a transient scope.
///
/// This is the default.
- pub async fn in_transient_scope(
- self,
- ) -> AsyncBindingWhenConfigurator<Interface, DIContainerType>
+ pub async fn in_transient_scope(self) -> AsyncBindingWhenConfigurator<Interface>
{
self.set_in_transient_scope().await;
@@ -69,10 +60,7 @@ where
/// Will return Err if resolving the implementation fails.
pub async fn in_singleton_scope(
self,
- ) -> Result<
- AsyncBindingWhenConfigurator<Interface, DIContainerType>,
- AsyncBindingScopeConfiguratorError,
- >
+ ) -> Result<AsyncBindingWhenConfigurator<Interface>, AsyncBindingScopeConfiguratorError>
{
let singleton: ThreadsafeSingletonPtr<Implementation> =
ThreadsafeSingletonPtr::from(
@@ -100,7 +88,7 @@ where
.set_binding::<Interface>(
BindingOptions::new(),
Box::new(
- AsyncTransientTypeProvider::<Implementation, DIContainerType>::new(),
+ AsyncTransientTypeProvider::<Implementation, AsyncDIContainer>::new(),
),
)
.await;
@@ -112,13 +100,13 @@ mod tests
{
use super::*;
use crate::dependency_history::MockDependencyHistory;
- use crate::test_utils::{mocks, subjects_async};
+ use crate::di_container::asynchronous::MockAsyncDIContainer;
+ use crate::test_utils::subjects_async;
#[tokio::test]
async fn in_transient_scope_works()
{
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_set_binding::<dyn subjects_async::IUserManager>()
@@ -130,7 +118,6 @@ mod tests
AsyncBindingScopeConfigurator::<
dyn subjects_async::IUserManager,
subjects_async::UserManager,
- mocks::async_di_container::MockAsyncDIContainer,
>::new(Arc::new(di_container_mock), MockDependencyHistory::new);
binding_scope_configurator.in_transient_scope().await;
@@ -139,8 +126,7 @@ mod tests
#[tokio::test]
async fn in_singleton_scope_works()
{
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_set_binding::<dyn subjects_async::IUserManager>()
@@ -152,7 +138,6 @@ mod tests
AsyncBindingScopeConfigurator::<
dyn subjects_async::IUserManager,
subjects_async::UserManager,
- mocks::async_di_container::MockAsyncDIContainer,
>::new(Arc::new(di_container_mock), MockDependencyHistory::new);
assert!(binding_scope_configurator
diff --git a/src/di_container/asynchronous/binding/when_configurator.rs b/src/di_container/asynchronous/binding/when_configurator.rs
index 4521178..3c1de7c 100644
--- a/src/di_container/asynchronous/binding/when_configurator.rs
+++ b/src/di_container/asynchronous/binding/when_configurator.rs
@@ -1,33 +1,29 @@
-//! When configurator for a binding for types inside of a [`IAsyncDIContainer`].
-//!
-//! [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
+//! When configurator for a binding for types inside of a [`AsyncDIContainer`].
use std::any::type_name;
use std::marker::PhantomData;
use std::sync::Arc;
-use crate::di_container::asynchronous::IAsyncDIContainer;
use crate::di_container::BindingOptions;
use crate::errors::async_di_container::AsyncBindingWhenConfiguratorError;
+use crate::util::use_double;
-/// When configurator for a binding for type `Interface` inside a [`IAsyncDIContainer`].
-///
-/// [`IAsyncDIContainer`]: crate::di_container::asynchronous::IAsyncDIContainer
-pub struct AsyncBindingWhenConfigurator<Interface, DIContainerType>
+use_double!(crate::di_container::asynchronous::AsyncDIContainer);
+
+/// When configurator for a binding for type `Interface` inside a [`AsyncDIContainer`].
+pub struct AsyncBindingWhenConfigurator<Interface>
where
Interface: 'static + ?Sized + Send + Sync,
- DIContainerType: IAsyncDIContainer,
{
- di_container: Arc<DIContainerType>,
+ di_container: Arc<AsyncDIContainer>,
interface_phantom: PhantomData<Interface>,
}
-impl<Interface, DIContainerType> AsyncBindingWhenConfigurator<Interface, DIContainerType>
+impl<Interface> AsyncBindingWhenConfigurator<Interface>
where
Interface: 'static + ?Sized + Send + Sync,
- DIContainerType: IAsyncDIContainer,
{
- pub(crate) fn new(di_container: Arc<DIContainerType>) -> Self
+ pub(crate) fn new(di_container: Arc<AsyncDIContainer>) -> Self
{
Self {
di_container,
@@ -71,14 +67,14 @@ mod tests
use mockall::predicate::eq;
use super::*;
+ use crate::di_container::asynchronous::MockAsyncDIContainer;
use crate::provider::r#async::MockIAsyncProvider;
- use crate::test_utils::{mocks, subjects_async};
+ use crate::test_utils::subjects_async;
#[tokio::test]
async fn when_named_works()
{
- let mut di_container_mock =
- mocks::async_di_container::MockAsyncDIContainer::new();
+ let mut di_container_mock = MockAsyncDIContainer::new();
di_container_mock
.expect_remove_binding::<dyn subjects_async::INumber>()
@@ -94,7 +90,6 @@ mod tests
let binding_when_configurator = AsyncBindingWhenConfigurator::<
dyn subjects_async::INumber,
- mocks::async_di_container::MockAsyncDIContainer,
>::new(Arc::new(di_container_mock));
assert!(binding_when_configurator