enum-fun-macros 0.1.6

Helper for enum-fun crate.
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::{Error, Fields, ItemEnum, Result, spanned::Spanned};

pub fn variants(item: ItemEnum) -> Result<TokenStream> {
    let (vis, ident, variants) = (&item.vis, &item.ident, &item.variants);
    let variant_idents = variants
        .iter()
        .map(|variant| {
            let &Fields::Unit = &variant.fields else {
                return Err(Error::new(
                    variant.fields.span(),
                    "expected enum without fields",
                ));
            };
            Ok(&variant.ident)
        })
        .collect::<Result<Vec<_>>>()?;

    let variant_count = variant_idents.len();

    Ok(quote! {
        impl #ident {
            #vis const VARIANT_COUNT: usize = #variant_count;
            #vis const VARIANTS: [Self; #variant_count] = [#(Self::#variant_idents),*];

            #vis fn variants() -> impl std::iter::ExactSizeIterator<Item = Self> {
                [#(Self::#variant_idents),*].into_iter()
            }
        }
    })
}