aboutsummaryrefslogtreecommitdiff
path: root/src/di_container/asynchronous
diff options
context:
space:
mode:
Diffstat (limited to 'src/di_container/asynchronous')
-rw-r--r--src/di_container/asynchronous/mod.rs85
1 files changed, 66 insertions, 19 deletions
diff --git a/src/di_container/asynchronous/mod.rs b/src/di_container/asynchronous/mod.rs
index 2939ddd..e5f7f5d 100644
--- a/src/di_container/asynchronous/mod.rs
+++ b/src/di_container/asynchronous/mod.rs
@@ -59,6 +59,7 @@ use async_trait::async_trait;
use crate::di_container::asynchronous::binding::builder::AsyncBindingBuilder;
use crate::di_container::binding_storage::DIContainerBindingStorage;
+use crate::di_container::BindingOptions;
use crate::errors::async_di_container::AsyncDIContainerError;
use crate::future::BoxFuture;
use crate::private::cast::arc::CastArc;
@@ -116,14 +117,50 @@ pub trait IAsyncDIContainer:
'a: 'b,
Self: 'b;
- #[doc(hidden)]
- async fn get_bound<Interface>(
- self: &Arc<Self>,
+ /// Returns the type bound with `Interface` where the binding has the specified
+ /// options.
+ ///
+ /// `dependency_history` is passed to the bound type when it is being resolved.
+ ///
+ /// # Errors
+ /// Will return `Err` if:
+ /// - No binding for `Interface` exists
+ /// - Resolving the binding for `Interface` fails
+ /// - Casting the binding for `Interface` fails
+ ///
+ /// # Examples
+ /// ```
+ /// # use syrette::di_container::asynchronous::AsyncDIContainer;
+ /// # use syrette::di_container::asynchronous::IAsyncDIContainer;
+ /// # use syrette::dependency_history::DependencyHistory;
+ /// # use syrette::di_container::BindingOptions;
+ /// #
+ /// # struct EventHandler {}
+ /// # struct Button {}
+ /// #
+ /// # Box::pin(async {
+ /// # let di_container = AsyncDIContainer::new();
+ /// #
+ /// let mut dependency_history = DependencyHistory::new();
+ ///
+ /// dependency_history.push::<EventHandler>();
+ ///
+ /// di_container
+ /// .get_bound::<Button>(dependency_history, BindingOptions::new().name("huge"))
+ /// .await?;
+ /// #
+ /// # Ok::<_, Box<dyn std::error::Error>>(())
+ /// # });
+ /// ```
+ fn get_bound<'this, 'fut, Interface>(
+ self: &'this Arc<Self>,
dependency_history: DependencyHistory,
- name: Option<&'static str>,
- ) -> Result<SomePtr<Interface>, AsyncDIContainerError>
+ binding_options: BindingOptions<'static>,
+ ) -> BoxFuture<'fut, Result<SomePtr<Interface>, AsyncDIContainerError>>
where
- Interface: 'static + ?Sized + Send + Sync;
+ Interface: 'static + 'this + ?Sized + Send + Sync,
+ 'this: 'fut,
+ Self: 'fut;
}
/// Async dependency injection container.
@@ -163,7 +200,7 @@ impl IAsyncDIContainer for AsyncDIContainer
Self: 'b,
{
Box::pin(async {
- self.get_bound::<Interface>(DependencyHistory::new(), None)
+ self.get_bound::<Interface>(DependencyHistory::new(), BindingOptions::new())
.await
})
}
@@ -178,24 +215,34 @@ impl IAsyncDIContainer for AsyncDIContainer
Self: 'b,
{
Box::pin(async {
- self.get_bound::<Interface>(DependencyHistory::new(), Some(name))
- .await
+ self.get_bound::<Interface>(
+ DependencyHistory::new(),
+ BindingOptions::new().name(name),
+ )
+ .await
})
}
- async fn get_bound<Interface>(
- self: &Arc<Self>,
+ fn get_bound<'this, 'fut, Interface>(
+ self: &'this Arc<Self>,
dependency_history: DependencyHistory,
- name: Option<&'static str>,
- ) -> Result<SomePtr<Interface>, AsyncDIContainerError>
+ binding_options: BindingOptions<'static>,
+ ) -> BoxFuture<'fut, Result<SomePtr<Interface>, AsyncDIContainerError>>
where
- Interface: 'static + ?Sized + Send + Sync,
+ Interface: 'static + 'this + ?Sized + Send + Sync,
+ 'this: 'fut,
+ Self: 'fut,
{
- let binding_providable = self
- .get_binding_providable::<Interface>(name, dependency_history)
- .await?;
-
- self.handle_binding_providable(binding_providable).await
+ Box::pin(async move {
+ let binding_providable = self
+ .get_binding_providable::<Interface>(
+ binding_options.name,
+ dependency_history,
+ )
+ .await?;
+
+ self.handle_binding_providable(binding_providable).await
+ })
}
}