sui_field_count_derive/
lib.rs1use proc_macro::TokenStream;
5
6use quote::quote;
7use syn::DeriveInput;
8use syn::parse_macro_input;
9
10#[proc_macro_derive(FieldCount)]
11pub fn field_count_derive(input: TokenStream) -> TokenStream {
12 let input = parse_macro_input!(input as DeriveInput);
13 let name = input.ident;
14 let generics = input.generics;
15 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
16
17 let fields_count = match input.data {
18 syn::Data::Struct(data_struct) => data_struct.fields.len(),
19 syn::Data::Enum(data_enum) => data_enum.variants.len(),
20 syn::Data::Union(_) => panic!("FieldCount cannot be derived for unions"),
21 };
22
23 let expanded = quote! {
24 impl #impl_generics FieldCount for #name #ty_generics #where_clause {
25 const FIELD_COUNT: usize = #fields_count;
26 }
27 };
28 TokenStream::from(expanded)
29}