enum-filter 0.1.0

Filter to a specific enum variant from an iterator
Documentation
use quote::format_ident;
use syn::{parse_quote, DataEnum, Generics, Ident, ItemTrait, TraitItemFn, Visibility};

use crate::names::fn_name;

pub(crate) fn generate_trait(vis: &Visibility, name: &Ident, enum_data: &DataEnum) -> ItemTrait {
    let generic_names = (0..enum_data.variants.len()).map(|i| format_ident!("V{}", i));
    let generics: Generics = parse_quote! {<I, #(#generic_names,)* >};

    let trait_defs = enum_data
        .variants
        .iter()
        .enumerate()
        .map(|(i, v)| -> TraitItemFn {
            let fn_name = fn_name(&v.ident);
            let ret = format_ident!("V{}", i);
            parse_quote! {
                fn #fn_name(self) -> std::iter::FilterMap<Self, fn(I) -> Option<#ret>>;
            }
        });

    parse_quote! {
        #vis trait #name #generics
        where Self: Sized,
        {
            #(#trait_defs)*
        }
    }
}