cgp_component_macro_lib/delegate_components/
impl_delegate.rs1use 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}