aboutsummaryrefslogtreecommitdiff
path: root/macros/src/lib.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-09-18 14:42:23 +0200
committerHampusM <hampus@hampusmat.com>2022-09-18 14:42:23 +0200
commit8d15cf4888be1261a0e6ec39088dc8104d6f0197 (patch)
tree34b0965ab5ffb2520da32c68a9494da9206daabf /macros/src/lib.rs
parent5a55fc3934675aa0d96ccb5e8e3466095e2c75a9 (diff)
refactor: add put factory return types in TransientPtr automatically
Diffstat (limited to 'macros/src/lib.rs')
-rw-r--r--macros/src/lib.rs25
1 files changed, 20 insertions, 5 deletions
diff --git a/macros/src/lib.rs b/macros/src/lib.rs
index 3f75340..27577c7 100644
--- a/macros/src/lib.rs
+++ b/macros/src/lib.rs
@@ -152,6 +152,8 @@ pub fn injectable(args_stream: TokenStream, impl_stream: TokenStream) -> TokenSt
/// Makes a type alias usable as a factory interface.
///
+/// The return type is automatically put inside of a [`TransientPtr`].
+///
/// *This macro is only available if Syrette is built with the "factory" feature.*
///
/// # Arguments
@@ -166,8 +168,6 @@ pub fn injectable(args_stream: TokenStream, impl_stream: TokenStream) -> TokenSt
/// # Examples
/// ```
/// # use syrette::factory;
-/// # use syrette::interfaces::factory::IFactory;
-/// # use syrette::ptr::TransientPtr;
/// #
/// # trait IConfigurator {}
/// #
@@ -184,12 +184,15 @@ pub fn injectable(args_stream: TokenStream, impl_stream: TokenStream) -> TokenSt
/// # impl IConfigurator for Configurator {}
/// #
/// #[factory]
-/// type IConfiguratorFactory = dyn Fn(Vec<String>) -> TransientPtr<dyn IConfigurator>;
+/// type IConfiguratorFactory = dyn Fn(Vec<String>) -> dyn IConfigurator;
/// ```
#[proc_macro_attribute]
#[cfg(feature = "factory")]
pub fn factory(args_stream: TokenStream, type_alias_stream: TokenStream) -> TokenStream
{
+ use quote::ToTokens;
+ use syn::Type;
+
use crate::factory_macro_args::FactoryMacroArgs;
let FactoryMacroArgs { flags } = parse(args_stream).unwrap();
@@ -200,12 +203,24 @@ pub fn factory(args_stream: TokenStream, type_alias_stream: TokenStream) -> Toke
.map_or(false, |flag| flag.is_on.value);
let factory_type_alias::FactoryTypeAlias {
- type_alias,
- factory_interface,
+ mut type_alias,
+ mut factory_interface,
arg_types: _,
return_type: _,
} = parse(type_alias_stream).unwrap();
+ let output = factory_interface.output.clone();
+
+ factory_interface.output = parse(
+ quote! {
+ syrette::ptr::TransientPtr<#output>
+ }
+ .into(),
+ )
+ .unwrap();
+
+ type_alias.ty = Box::new(Type::Verbatim(factory_interface.to_token_stream()));
+
let decl_interfaces = if is_threadsafe {
quote! {
syrette::declare_interface!(