cgp_macro_lib/entrypoints/
cgp_new_provider.rs1use 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}