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