db_proc_macro 0.1.0

Procedural macros for db_core project
Documentation
use proc_macro::TokenStream;
use syn::{parse_macro_input, DeriveInput, Data, Fields};
use quote::quote;


pub fn derive_to_fields(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let struct_name = input.ident;
    // 提取字段名
    let fields = match input.data {
        Data::Struct(data_struct) => match data_struct.fields {
            Fields::Named(struct_fields) => struct_fields
                .named
                .iter()
                .map(|f| f.ident.as_ref().unwrap().to_string())
                .collect::<Vec<_>>(),
            _ => panic!("SqlFields only supports named fields"),
        },
        _ => panic!("SqlFields only supports structs"),
    };

    // 生成 "id,username,email"
    let field_str = fields.join(",");
    // 生成 Vec<String> 构造表达式
    let field_array = fields.iter().map(|f| {
        // let name = syn::LitStr::new(f, proc_macro2::Span::call_site());
        let name = f.as_str();
        quote! { #name }
    });

    let array_len = fields.len();
    // 生成代码
    let expanded = quote! {
        impl #struct_name {
            pub const FIELDS: &'static str = #field_str;
            pub const FIELD_ARR: [&'static str; #array_len] = [#(#field_array),*];
        }
    };
    TokenStream::from(expanded)
}