sui_field_count_derive/
lib.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use 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}