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