cgp-macro-lib 0.7.0

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

use crate::delegate_components::{define_struct, impl_delegate_components};
use crate::parse::{DelegateComponents, SimpleType, TypeGenerics};

pub fn delegate_components(body: TokenStream) -> syn::Result<TokenStream> {
    let spec: DelegateComponents = parse2(body)?;

    let component_struct = if spec.new_struct {
        let target_type: SimpleType<TypeGenerics> = parse2(spec.target_type.to_token_stream())?;

        let type_generics = target_type.generics.unwrap_or_default().generics;

        let component_struct = define_struct(&target_type.name, &type_generics)?;

        Some(component_struct)
    } else {
        None
    };

    let impl_items =
        impl_delegate_components(&spec.target_type, &spec.target_generics, &spec.entries)?;

    let mut output = quote! {
        #component_struct
    };

    for impl_item in impl_items {
        output.extend(impl_item.to_token_stream());
    }

    Ok(output)
}