This is unreleased documentation for Yew Next version.
For up-to-date documentation, see the latest version on docs.rs.

yew_macro/derive_props/
wrapper.rs

1use 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}