cgp_macro_lib/entrypoints/
cgp_new_provider.rs

1use proc_macro2::TokenStream;
2use quote::quote;
3use syn::{ItemImpl, Type};
4
5use crate::derive_provider::{
6    derive_component_name_from_provider_impl, derive_is_provider_for, derive_provider_struct,
7};
8
9pub fn cgp_new_provider(attr: TokenStream, body: TokenStream) -> syn::Result<TokenStream> {
10    let provider_impl: ItemImpl = syn::parse2(body)?;
11
12    let component_name: Type = if !attr.is_empty() {
13        syn::parse2(attr)?
14    } else {
15        derive_component_name_from_provider_impl(&provider_impl)?
16    };
17
18    let provider_struct = derive_provider_struct(&provider_impl)?;
19
20    let is_provider_for_impl: ItemImpl = derive_is_provider_for(&component_name, &provider_impl)?;
21
22    let result = quote! {
23        #provider_struct
24        #provider_impl
25        #is_provider_for_impl
26    };
27
28    Ok(result)
29}