diff options
author | HampusM <hampus@hampusmat.com> | 2022-09-18 14:42:23 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-09-18 14:42:23 +0200 |
commit | 8d15cf4888be1261a0e6ec39088dc8104d6f0197 (patch) | |
tree | 34b0965ab5ffb2520da32c68a9494da9206daabf /macros | |
parent | 5a55fc3934675aa0d96ccb5e8e3466095e2c75a9 (diff) |
refactor: add put factory return types in TransientPtr automatically
Diffstat (limited to 'macros')
-rw-r--r-- | macros/src/lib.rs | 25 |
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!( |