enum-helper-derive 0.1.0

Procedural macro implementation for enum-helper
Documentation
use proc_macro2::TokenStream;
use quote::quote;

use crate::enum_all::Ir;

pub fn generate(ir: Ir<'_>) -> TokenStream {
    gen_impl_enum_all(&ir)
}

fn gen_impl_enum_all(ir: &Ir<'_>) -> TokenStream {
    let ident = &ir.ident;
    let (impl_generics, ty_generics, where_clause) = &ir.generics.split_for_impl();

    let all_array: Vec<_> = ir
        .variants
        .iter()
        .filter(|v| !v.skip)
        .map(|v| {
            let v_ident = &v.ident;
            quote! { Self::#v_ident }
        })
        .collect();

    let count = all_array.len();

    quote! {
        #[automatically_derived]
        impl #impl_generics ::enum_helper::EnumAll for #ident #ty_generics #where_clause {
            type All = [Self; #count];
            const ALL: Self::All = [#(#all_array,)*];
        }
    }
}