diff --git a/src/lib.rs b/src/lib.rs index e781f48..764a862 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,28 +1,25 @@ use proc_macro::TokenStream; use quote::quote; -use syn::{parse_macro_input, Attribute, Data, DeriveInput, Fields, Meta, NestedMeta}; +use syn::{parse_macro_input, DeriveInput, Data, Fields, Lit}; #[proc_macro_derive(HttpGetRequest, attributes(http_get))] pub fn derive_http_get_request(input: TokenStream) -> TokenStream { let input = parse_macro_input!(input as DeriveInput); - let name = input.ident; + let name = &input.ident; - // Extract the #[http_get(url = "...")] attribute + // Parse #[http_get(url = "...")] attribute let mut base_url = None; for attr in &input.attrs { if attr.path().is_ident("http_get") { - let meta = attr.parse_meta().expect("Invalid #[http_get] syntax"); - if let Meta::List(meta_list) = meta { - for nested in meta_list.nested { - if let NestedMeta::Meta(Meta::NameValue(nv)) = nested { - if nv.path.is_ident("url") { - if let syn::Lit::Str(lit_str) = nv.lit { - base_url = Some(lit_str.value()); - } - } + let _ = attr.parse_nested_meta(|meta| { + if meta.path.is_ident("url") { + let value: Lit = meta.value()?.parse()?; + if let Lit::Str(litstr) = value { + base_url = Some(litstr.value()); } } - } + Ok(()) + }); } } @@ -32,7 +29,7 @@ pub fn derive_http_get_request(input: TokenStream) -> TokenStream { Data::Struct(data_struct) => { let fields = match &data_struct.fields { Fields::Named(named) => &named.named, - _ => panic!("#[derive(HttpGetRequest)] supports only named fields for structs"), + _ => panic!("#[derive(HttpGetRequest)] only supports structs with named fields"), }; let mut query_param_code = Vec::new(); @@ -98,9 +95,7 @@ pub fn derive_http_get_request(input: TokenStream) -> TokenStream { #name::#vname(inner) => inner.send(client.clone(), headers.clone(), api_key).await, }); } - _ => panic!( - "#[derive(HttpGetRequest)] enum variants must have a single unnamed field" - ), + _ => panic!("#[derive(HttpGetRequest)] enum variants must have a single unnamed field"), } }