cgp-macro-lib 0.7.0

Context-generic programming core component macros implemented as a library.
Documentation
use alloc::vec::Vec;

use proc_macro2::TokenStream;
use quote::quote;
use syn::punctuated::Punctuated;
use syn::token::Comma;
use syn::{ImplItemFn, Signature, Visibility, parse2};

use crate::derive_component::signature_args::signature_to_args;

pub fn derive_delegated_fn_impl(
    sig: &Signature,
    delegator: &TokenStream,
) -> syn::Result<ImplItemFn> {
    let fn_name = &sig.ident;

    let args: Punctuated<_, Comma> = signature_to_args(sig).collect();

    let await_expr: TokenStream = if sig.asyncness.is_some() {
        quote!( .await )
    } else {
        TokenStream::new()
    };

    let body = parse2(quote!({
        #delegator :: #fn_name (
            #args
        ) #await_expr
    }))?;

    let item = ImplItemFn {
        attrs: Vec::new(),
        vis: Visibility::Inherited,
        defaultness: None,
        sig: sig.clone(),
        block: body,
    };

    Ok(item)
}