nb_field_names/
lib.rs

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}