aboutsummaryrefslogtreecommitdiff
path: root/macros/src/lib.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-08-31 21:41:27 +0200
committerHampusM <hampus@hampusmat.com>2022-08-31 21:41:27 +0200
commita9ff2f16812b56107604400a64a7f482d017eca1 (patch)
tree8b562fbe95c0356ab4ff85121df4720fcc00783a /macros/src/lib.rs
parent576111c38dbb80ff535636e6120db610842d81f1 (diff)
feat: add a threadsafe flag to the declare_default_factory macro
Diffstat (limited to 'macros/src/lib.rs')
-rw-r--r--macros/src/lib.rs85
1 files changed, 84 insertions, 1 deletions
diff --git a/macros/src/lib.rs b/macros/src/lib.rs
index 7d466aa..7083b44 100644
--- a/macros/src/lib.rs
+++ b/macros/src/lib.rs
@@ -6,8 +6,9 @@
use proc_macro::TokenStream;
use quote::quote;
-use syn::{parse, parse_macro_input};
+use syn::{parse, parse_macro_input, ItemTrait};
+mod decl_def_factory_args;
mod declare_interface_args;
mod dependency;
mod factory_macro_args;
@@ -247,6 +248,88 @@ pub fn factory(args_stream: TokenStream, type_alias_stream: TokenStream) -> Toke
.into()
}
+/// Shortcut for declaring a default factory.
+///
+/// A default factory is a factory that doesn't take any arguments.
+///
+/// The more tedious way to accomplish what this macro does would be by using
+/// the [`factory`] macro.
+///
+/// *This macro is only available if Syrette is built with the "factory" feature.*
+///
+/// # Arguments
+/// - Interface trait
+/// * (Zero or more) Flags. Like `a = true, b = false`
+///
+/// # Flags
+/// - `threadsafe` - Mark as threadsafe.
+///
+/// # Panics
+/// If the provided arguments are invalid.
+///
+/// # Examples
+/// ```
+/// # use syrette::declare_default_factory;
+/// #
+/// trait IParser
+/// {
+/// // Methods and etc here...
+/// }
+///
+/// declare_default_factory!(dyn IParser);
+/// ```
+#[proc_macro]
+#[cfg(feature = "factory")]
+pub fn declare_default_factory(args_stream: TokenStream) -> TokenStream
+{
+ use crate::decl_def_factory_args::DeclareDefaultFactoryMacroArgs;
+
+ let DeclareDefaultFactoryMacroArgs { interface, flags } = parse(args_stream).unwrap();
+
+ let is_threadsafe = flags
+ .iter()
+ .find(|flag| flag.flag.to_string().as_str() == "threadsafe")
+ .map_or(false, |flag| flag.is_on.value);
+
+ if is_threadsafe {
+ return quote! {
+ syrette::declare_interface!(
+ syrette::castable_factory::threadsafe::ThreadsafeCastableFactory<
+ (),
+ #interface,
+ > -> syrette::interfaces::factory::IFactory<(), #interface>,
+ async = true
+ );
+
+ syrette::declare_interface!(
+ syrette::castable_factory::threadsafe::ThreadsafeCastableFactory<
+ (),
+ #interface,
+ > -> syrette::interfaces::any_factory::AnyFactory,
+ async = true
+ );
+ }
+ .into();
+ }
+
+ quote! {
+ syrette::declare_interface!(
+ syrette::castable_factory::blocking::CastableFactory<
+ (),
+ #interface,
+ > -> syrette::interfaces::factory::IFactory<(), #interface>
+ );
+
+ syrette::declare_interface!(
+ syrette::castable_factory::blocking::CastableFactory<
+ (),
+ #interface,
+ > -> syrette::interfaces::any_factory::AnyFactory
+ );
+ }
+ .into()
+}
+
/// Declares the interface trait of a implementation.
///
/// # Arguments