1use proc_macro::TokenStream;
2use syn::parse_macro_input;
3
4#[proc_macro_derive(FieldNames)]
5pub fn field_names(stream: TokenStream) -> TokenStream {
6 let input = parse_macro_input!(stream as syn::DeriveInput);
7 let name = input.ident;
8 if let syn::Data::Struct(s) = input.data {
9 let fields = s.fields;
10 let mut funcs = Vec::new();
11 for field in fields {
12 if let Some(ident) = field.ident {
13 funcs.push(quote::quote! {
14 pub fn #ident() -> String {
15 stringify!(#ident).into()
16 }
17 });
18 }
19 }
20 return quote::quote! {
21 impl #name {
22 #(#funcs)*
23 }
24 }
25 .into();
26 }
27 panic!("Only structs are supported");
28}