diff options
| author | John Turner <jturner.usa@gmail.com> | 2023-04-20 01:48:17 -0400 |
|---|---|---|
| committer | John Turner <jturner.usa@gmail.com> | 2023-04-20 01:48:17 -0400 |
| commit | 66e43c415713dc112d52247b758bf8254756ebde (patch) | |
| tree | 995c89c2fe7cf42ce1dccf965052e45aaf4ac34c /src/lib.rs | |
| parent | 76f5fef8e35d5698d163c062fe2082f8949491f6 (diff) | |
| download | get-66e43c415713dc112d52247b758bf8254756ebde.tar.gz | |
added GetCopy derive macro
Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 29 |
1 files changed, 24 insertions, 5 deletions
@@ -6,6 +6,12 @@ pub fn get(input: proc_macro::TokenStream) -> proc_macro::TokenStream { get::expand(&parsed_input, false).unwrap().into() } +#[proc_macro_derive(GetCopy, attributes(get))] +pub fn get_copy(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let parsed_input = syn::parse_macro_input!(input as syn::DeriveInput); + get::expand(&parsed_input, true).unwrap().into() +} + mod get { use if_chain::if_chain; @@ -117,14 +123,27 @@ mod get { Type::Reference(type_ref) => Some(&type_ref.lifetime), _ => None, }; - let reference = (!is_copy).then(|| quote! { & }); + let method_args = if is_copy { + quote! { ( self ) } + } else { + quote! { ( & #field_lifetime self ) } + }; + let method_type = if is_copy { + quote! { #field_type } + } else { + quote! { & #field_type } + }; + let method_body = if is_copy { + quote! { { self . #field_name } } + } else { + quote! { { & self . #field_name } } + }; quote! { pub fn #method_name - ( #reference #field_lifetime self ) - -> #reference #field_type { - #reference self.#field_name - } + #method_args + -> #method_type + #method_body } } |
