cgp-macro-lib 0.7.0

Context-generic programming core component macros implemented as a library.
Documentation
use quote::quote;
use syn::{ItemEnum, ItemImpl, parse2};

use crate::derive_has_fields::from_fields_struct::derive_from_field_params;

pub fn derive_from_fields_for_enum(item_enum: &ItemEnum) -> syn::Result<ItemImpl> {
    let enum_name = &item_enum.ident;
    let (impl_generics, type_generics, where_clause) = item_enum.generics.split_for_impl();

    let mut match_expr = quote! {
        match rest {}
    };

    for variant in item_enum.variants.iter().rev() {
        let variant_ident = &variant.ident;

        let (product_arg, product_constructor_args) = derive_from_field_params(&variant.fields)?;

        match_expr = quote! {
            match rest {
                σ::Left( field ) => {
                    let #product_arg = field.value;
                    Self:: #variant_ident #product_constructor_args
                }
                σ::Right(rest) => {
                    #match_expr
                }
            }
        }
    }

    let item_impl = quote! {
        impl #impl_generics
            FromFields for #enum_name #type_generics
        #where_clause
        {
            fn from_fields(
                rest: Self::Fields,
            ) -> Self {
                #match_expr
            }
        }
    };

    parse2(item_impl)
}