From 6813690e893bc461bd2be60509850a5a80454c6a Mon Sep 17 00:00:00 2001 From: HampusM Date: Sun, 18 Sep 2022 20:20:53 +0200 Subject: feat: add binding async factories to async DI container --- src/async_di_container.rs | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/async_di_container.rs') diff --git a/src/async_di_container.rs b/src/async_di_container.rs index 7dcca57..1ead116 100644 --- a/src/async_di_container.rs +++ b/src/async_di_container.rs @@ -294,6 +294,54 @@ where Ok(AsyncBindingWhenConfigurator::new(self.di_container.clone())) } + /// Creates a binding of factory type `Interface` to a async factory inside of the + /// associated [`AsyncDIContainer`]. + /// + /// *This function is only available if Syrette is built with the "factory" and + /// "async" features.* + /// + /// # Errors + /// Will return Err if the associated [`AsyncDIContainer`] already have a binding for + /// the interface. + #[cfg(all(feature = "factory", feature = "async"))] + pub async fn to_async_factory( + &self, + factory_func: &'static FactoryFunc, + ) -> Result, AsyncBindingBuilderError> + where + Args: 'static, + Return: 'static + ?Sized, + Interface: Fn>, + FactoryFunc: Fn< + (Arc,), + Output = Box< + (dyn Fn>), + >, + > + Send + + Sync, + { + let mut bindings_lock = self.di_container.bindings.lock().await; + + if bindings_lock.has::(None) { + return Err(AsyncBindingBuilderError::BindingAlreadyExists(type_name::< + Interface, + >( + ))); + } + + let factory_impl = ThreadsafeCastableFactory::new(factory_func); + + bindings_lock.set::( + None, + Box::new(crate::provider::r#async::AsyncFactoryProvider::new( + crate::ptr::ThreadsafeFactoryPtr::new(factory_impl), + false, + )), + ); + + Ok(AsyncBindingWhenConfigurator::new(self.di_container.clone())) + } + /// Creates a binding of type `Interface` to a factory that takes no arguments /// inside of the associated [`AsyncDIContainer`]. /// -- cgit v1.2.3-18-g5258