cgp_macro_lib/entrypoints/
delegate_components.rs1use proc_macro2::TokenStream;
2use quote::{ToTokens, quote};
3use syn::parse2;
4
5use crate::delegate_components::{define_struct, impl_delegate_components};
6use crate::parse::{DelegateComponents, SimpleType, TypeGenerics};
7
8pub fn delegate_components(body: TokenStream) -> syn::Result<TokenStream> {
9 let spec: DelegateComponents = parse2(body)?;
10
11 let component_struct = if spec.new_struct {
12 let target_type: SimpleType<TypeGenerics> = parse2(spec.target_type.to_token_stream())?;
13
14 let type_generics = target_type.generics.unwrap_or_default().generics;
15
16 let component_struct = define_struct(&target_type.name, &type_generics)?;
17
18 Some(component_struct)
19 } else {
20 None
21 };
22
23 let impl_items =
24 impl_delegate_components(&spec.target_type, &spec.target_generics, &spec.entries)?;
25
26 let mut output = quote! {
27 #component_struct
28 };
29
30 for impl_item in impl_items {
31 output.extend(impl_item.to_token_stream());
32 }
33
34 Ok(output)
35}