cgp_component_macro_lib/delegate_components/
impl_delegate.rs

1use alloc::boxed::Box;
2use alloc::vec;
3use alloc::vec::Vec;
4
5use syn::{parse_quote, Generics, ImplItem, ImplItemType, ItemImpl, Path, Type};
6
7use crate::delegate_components::ast::{ComponentAst, DelegateEntriesAst};
8use crate::delegate_components::merge_generics::merge_generics;
9
10pub fn impl_delegate_components(
11    target_type: &Type,
12    target_generics: &Generics,
13    delegate_entries: &DelegateEntriesAst,
14) -> Vec<ItemImpl> {
15    delegate_entries
16        .entries
17        .iter()
18        .flat_map(|entry| {
19            let source = &entry.source;
20
21            entry.components.iter().map(|component| {
22                impl_delegate_component(target_type, target_generics, component, source)
23            })
24        })
25        .collect()
26}
27
28pub fn impl_delegate_component(
29    target_type: &Type,
30    target_generics: &Generics,
31    component: &ComponentAst,
32    source: &Type,
33) -> ItemImpl {
34    let component_type = &component.component_type;
35
36    let trait_path: Path = parse_quote!(DelegateComponent < #component_type >);
37
38    let delegate_type: ImplItemType = parse_quote!(type Delegate = #source;);
39
40    let generics = merge_generics(target_generics, &component.component_generics);
41
42    ItemImpl {
43        attrs: Vec::new(),
44        defaultness: None,
45        unsafety: None,
46        impl_token: Default::default(),
47        generics,
48        trait_: Some((None, trait_path, Default::default())),
49        self_ty: Box::new(target_type.clone()),
50        brace_token: Default::default(),
51        items: vec![ImplItem::Type(delegate_type)],
52    }
53}