summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorJohn Turner <jturner.usa@gmail.com>2023-04-20 01:48:17 -0400
committerJohn Turner <jturner.usa@gmail.com>2023-04-20 01:48:17 -0400
commit66e43c415713dc112d52247b758bf8254756ebde (patch)
tree995c89c2fe7cf42ce1dccf965052e45aaf4ac34c /src/lib.rs
parent76f5fef8e35d5698d163c062fe2082f8949491f6 (diff)
downloadget-66e43c415713dc112d52247b758bf8254756ebde.tar.gz
added GetCopy derive macro
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 27b847c..65c3857 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
}
}