aboutsummaryrefslogtreecommitdiff
path: root/src/di_container/asynchronous/binding/when_configurator.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/di_container/asynchronous/binding/when_configurator.rs')
-rw-r--r--src/di_container/asynchronous/binding/when_configurator.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/di_container/asynchronous/binding/when_configurator.rs b/src/di_container/asynchronous/binding/when_configurator.rs
new file mode 100644
index 0000000..b245ad8
--- /dev/null
+++ b/src/di_container/asynchronous/binding/when_configurator.rs
@@ -0,0 +1,54 @@
+//! 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::errors::async_di_container::AsyncBindingWhenConfiguratorError;
+use crate::AsyncDIContainer;
+
+/// When configurator for a binding for type 'Interface' inside a [`AsyncDIContainer`].
+pub struct AsyncBindingWhenConfigurator<Interface>
+where
+ Interface: 'static + ?Sized + Send + Sync,
+{
+ di_container: Arc<AsyncDIContainer>,
+ interface_phantom: PhantomData<Interface>,
+}
+
+impl<Interface> AsyncBindingWhenConfigurator<Interface>
+where
+ Interface: 'static + ?Sized + Send + Sync,
+{
+ pub(crate) fn new(di_container: Arc<AsyncDIContainer>) -> Self
+ {
+ Self {
+ di_container,
+ interface_phantom: PhantomData,
+ }
+ }
+
+ /// Configures the binding to have a name.
+ ///
+ /// # Errors
+ /// Will return Err if no binding for the interface already exists.
+ pub async fn when_named(
+ &self,
+ name: &'static str,
+ ) -> Result<(), AsyncBindingWhenConfiguratorError>
+ {
+ let mut bindings_lock = self.di_container.bindings.lock().await;
+
+ let binding = bindings_lock.remove::<Interface>(None).map_or_else(
+ || {
+ Err(AsyncBindingWhenConfiguratorError::BindingNotFound(
+ type_name::<Interface>(),
+ ))
+ },
+ Ok,
+ )?;
+
+ bindings_lock.set::<Interface>(Some(name), binding);
+
+ Ok(())
+ }
+}