cgp-macro-lib 0.6.1

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

use crate::derive_provider::{derive_component_name_from_provider_impl, derive_is_provider_for};

pub fn cgp_provider(attr: TokenStream, body: TokenStream) -> syn::Result<TokenStream> {
    let provider_impl: ItemImpl = parse2(body)?;

    let component_name: Type = if !attr.is_empty() {
        syn::parse2(attr)?
    } else {
        derive_component_name_from_provider_impl(&provider_impl)?
    };

    let is_provider_for_impl: ItemImpl = derive_is_provider_for(&component_name, &provider_impl)?;

    let result = quote! {
        #provider_impl
        #is_provider_for_impl
    };

    Ok(result)
}