cgp-macro-lib 0.7.0

Context-generic programming core component macros implemented as a library.
Documentation
use proc_macro2::{Span, TokenStream};
use quote::quote;
use syn::{Error, Ident, ItemTrait};

use crate::derive_component::preprocess_consumer_trait;
use crate::derive_getter::{derive_blanket_impl, parse_getter_fields};

pub fn cgp_auto_getter(attr: TokenStream, body: TokenStream) -> syn::Result<TokenStream> {
    if !attr.is_empty() {
        return Err(Error::new(
            Span::call_site(),
            "#[derive_auto_getter] does not accept any attribute argument",
        ));
    }

    let mut consumer_trait: ItemTrait = syn::parse2(body)?;

    preprocess_consumer_trait(&mut consumer_trait)?;

    let context_type = Ident::new("__Context__", Span::call_site());

    let (fields, field_type) = parse_getter_fields(&context_type, &consumer_trait)?;

    let blanket_impl = derive_blanket_impl(&context_type, &consumer_trait, &fields, &field_type)?;

    Ok(quote! {
        #consumer_trait
        #blanket_impl
    })
}