yew_macro/derive_props/
wrapper.rs1use proc_macro2::Ident;
2use quote::{quote, ToTokens};
3use syn::{Attribute, Generics};
4
5use super::PropField;
6
7pub struct PropsWrapper<'a> {
8 wrapper_name: &'a Ident,
9 generics: &'a Generics,
10 prop_fields: &'a [PropField],
11 extra_attrs: &'a [Attribute],
12}
13
14impl ToTokens for PropsWrapper<'_> {
15 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
16 let Self {
17 generics,
18 wrapper_name,
19 extra_attrs,
20 ..
21 } = self;
22
23 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
24 let turbofish_generics = ty_generics.as_turbofish();
25
26 let wrapper_field_defs = self.field_defs();
27 let wrapper_default_setters = self.default_setters();
28
29 let wrapper = quote! {
30 #[doc(hidden)]
31 #(#extra_attrs)*
32 struct #wrapper_name #generics
33 #where_clause
34 {
35 #(#wrapper_field_defs)*
36 }
37
38 #[automatically_derived]
39 impl #impl_generics ::std::default::Default for #wrapper_name #ty_generics #where_clause {
40 fn default() -> Self {
41 #wrapper_name #turbofish_generics {
42 #(#wrapper_default_setters)*
43 }
44 }
45 }
46 };
47 wrapper.to_tokens(tokens);
48 }
49}
50
51impl<'a> PropsWrapper<'a> {
52 pub fn new(
53 name: &'a Ident,
54 generics: &'a Generics,
55 prop_fields: &'a [PropField],
56 extra_attrs: &'a [Attribute],
57 ) -> Self {
58 PropsWrapper {
59 wrapper_name: name,
60 generics,
61 prop_fields,
62 extra_attrs,
63 }
64 }
65
66 fn field_defs(&self) -> impl Iterator<Item = impl ToTokens + '_> {
67 self.prop_fields.iter().map(|pf| pf.to_field_def())
68 }
69
70 fn default_setters(&self) -> impl Iterator<Item = impl ToTokens + '_> {
71 self.prop_fields.iter().map(|pf| pf.to_default_setter())
72 }
73}