io-plugin-macros 0.6.0

Macros for io-plugin
Documentation
use itertools::Itertools;
use quote::ToTokens;
use std::collections::HashSet;
use syn::{Variant, ItemEnum, punctuated::Punctuated, Ident};

pub fn variant_type_names(variant: &Variant) -> HashSet<String> {
    variant
        .fields
        .iter()
        .map(|f| f.ty.to_token_stream().to_string())
        .collect()
}

pub fn enum_generics(target: impl Iterator<Item = &Variant>, source: &ItemEnum) -> Punctuated<Ident, syn::token::Comma> {
    let types = target
        .map(variant_type_names)
        .flatten()
        .collect_vec();
    let types = source
        .generics
        .type_params()
        .filter_map(|t| {
            if types.contains(&t.ident.to_string()) {
                Some(t.ident.to_owned())
            } else {
                None
            }
        })
        .collect();
    types
}