more_convert_derive_internal/
enum_array.rs

1use proc_macro2::TokenStream;
2
3use crate::require_enum;
4
5pub fn derive_enum_array(input: syn::DeriveInput) -> syn::Result<TokenStream> {
6    let variants = require_enum(&input)?;
7    let ident = &input.ident;
8    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
9
10    let variants = variants.iter().map(|f| &f.ident).collect::<Vec<_>>();
11    let count = variants.len();
12
13    let token = quote::quote! {
14        impl #impl_generics #ident #ty_generics #where_clause {
15            pub const COUNT: usize = #count;
16            pub const VARIANTS: &[Self] = &[#(Self::#variants),*];
17        }
18    };
19
20    Ok(token)
21}