cgp_macro_lib/entrypoints/
delegate_components.rs

1use 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}