enum-filter 0.1.0

Filter to a specific enum variant from an iterator
Documentation
use quote::{format_ident, quote};
use syn::{parse_quote, Fields, ItemStruct, Variant};

pub(crate) fn generate_struct(variant: &Variant) -> Option<ItemStruct> {
    if let Fields::Named(f) = &variant.fields {
        let name = format_ident!("{}Data", variant.ident);
        let fields = &f.named;
        let generics = (0..fields.len()).map(|i| format_ident!("T{}", i));
        let generics = quote! {<#(#generics),*>};

        let fields = fields.iter().enumerate().map(|(i, f)| {
            let ident = f.ident.as_ref().unwrap();
            let t = format_ident!("T{}", i);
            quote! { #ident: #t }
        });

        Some(parse_quote! {
            struct #name #generics {
                #(#fields,)*
            }
        })
    } else {
        None
    }
}