aboutsummaryrefslogtreecommitdiff
path: root/macros/src/factory/build_declare_interfaces.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-09-24 16:14:45 +0200
committerHampusM <hampus@hampusmat.com>2022-09-24 16:14:45 +0200
commit2a44ec3ffdcd78b23ac31b722b4312774d643c3a (patch)
treed3056a1fffe6311f863c4d683cc3444507c3e7d8 /macros/src/factory/build_declare_interfaces.rs
parent695f90bf900015df1e2728445f833dabced838a9 (diff)
refactor!: remove repetition of declaring factory interfaces
BREAKING CHANGE: The to_default_factory method of the blocking and async DI containers now expect a function returning another function
Diffstat (limited to 'macros/src/factory/build_declare_interfaces.rs')
-rw-r--r--macros/src/factory/build_declare_interfaces.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/macros/src/factory/build_declare_interfaces.rs b/macros/src/factory/build_declare_interfaces.rs
new file mode 100644
index 0000000..ac4ddd6
--- /dev/null
+++ b/macros/src/factory/build_declare_interfaces.rs
@@ -0,0 +1,52 @@
+use proc_macro2::TokenStream;
+use quote::quote;
+
+use crate::fn_trait::FnTrait;
+
+pub fn build_declare_factory_interfaces(
+ factory_interface: &FnTrait,
+ is_threadsafe: bool,
+) -> TokenStream
+{
+ if is_threadsafe {
+ quote! {
+ syrette::declare_interface!(
+ syrette::castable_factory::threadsafe::ThreadsafeCastableFactory<
+ (std::sync::Arc<syrette::async_di_container::AsyncDIContainer>,),
+ #factory_interface
+ > -> syrette::interfaces::factory::IFactory<
+ (std::sync::Arc<syrette::async_di_container::AsyncDIContainer>,),
+ #factory_interface
+ >,
+ async = true
+ );
+
+ syrette::declare_interface!(
+ syrette::castable_factory::threadsafe::ThreadsafeCastableFactory<
+ (std::sync::Arc<syrette::async_di_container::AsyncDIContainer>,),
+ #factory_interface
+ > -> syrette::interfaces::any_factory::AnyThreadsafeFactory,
+ async = true
+ );
+ }
+ } else {
+ quote! {
+ syrette::declare_interface!(
+ syrette::castable_factory::blocking::CastableFactory<
+ (std::rc::Rc<syrette::di_container::DIContainer>,),
+ #factory_interface
+ > -> syrette::interfaces::factory::IFactory<
+ (std::rc::Rc<syrette::di_container::DIContainer>,),
+ #factory_interface
+ >
+ );
+
+ syrette::declare_interface!(
+ syrette::castable_factory::blocking::CastableFactory<
+ (std::rc::Rc<syrette::di_container::DIContainer>,),
+ #factory_interface
+ > -> syrette::interfaces::any_factory::AnyFactory
+ );
+ }
+ }
+}