cgp-macro-lib 0.6.1

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

use crate::derive_builder::to_generic_args;

pub fn derive_finalize_extract_impl(
    context_enum: &ItemEnum,
    extractor_ident: &Ident,
    is_ref: bool,
) -> syn::Result<ItemImpl> {
    let generics = {
        let mut generics = context_enum.generics.clone();

        if is_ref {
            generics.params.insert(
                0,
                parse2(quote! {
                    'a
                })?,
            );

            generics.params.insert(
                0,
                parse2(quote! {
                    __R__: MapTypeRef
                })?,
            );
        }

        generics
    };

    let mut generic_args = to_generic_args(&generics)?;

    for _variant in context_enum.variants.iter() {
        generic_args.args.push(parse2(quote! {
            IsVoid
        })?);
    }

    let (impl_generics, _, where_clause) = generics.split_for_impl();

    let extractor_type: Type = parse2(quote! {
        #extractor_ident #generic_args
    })?;

    let item_impl = parse2(quote! {
        impl #impl_generics FinalizeExtract for #extractor_type
        #where_clause
        {
            fn finalize_extract<__T__>(self) -> __T__ {
                match self {}
            }
        }
    })?;

    Ok(item_impl)
}