cgp_component_macro_lib/delegate_components/
define_struct.rs

1use syn::punctuated::Punctuated;
2use syn::token::Comma;
3use syn::{parse_quote, GenericParam, Generics, Ident, ItemStruct, Type};
4
5pub fn define_struct(ident: &Ident, generics: &Generics) -> ItemStruct {
6    if generics.params.is_empty() {
7        parse_quote! {
8            pub struct #ident;
9        }
10    } else {
11        let mut generic_params = generics.params.clone();
12        let mut phantom_params: Punctuated<Type, Comma> = Default::default();
13
14        for param in generic_params.iter_mut() {
15            match param {
16                GenericParam::Type(type_param) => {
17                    type_param.colon_token = None;
18                    type_param.bounds.clear();
19
20                    let type_ident = &type_param.ident;
21                    phantom_params.push(parse_quote!( #type_ident ));
22                }
23                GenericParam::Lifetime(life_param) => {
24                    life_param.colon_token = None;
25                    life_param.bounds.clear();
26
27                    let lifetime = &life_param.lifetime;
28                    phantom_params.push(parse_quote!( & #lifetime () ));
29                }
30                _ => {}
31            }
32        }
33
34        parse_quote! {
35            pub struct #ident < #generic_params > (
36                pub ::core::marker::PhantomData<( #phantom_params )>
37            );
38        }
39    }
40}