@@ -6,10 +6,19 @@ use crate::attr;
6
6
7
7
pub mod enums;
8
8
9
- pub fn read_fields ( fields : & syn:: Fields )
9
+ pub fn read_struct_field ( fields : & syn:: Fields )
10
+ -> TokenStream {
11
+ match * fields {
12
+ syn:: Fields :: Named ( ref fields_named) => read_named_fields_struct ( fields_named) ,
13
+ syn:: Fields :: Unnamed ( ref fields_unnamed) => read_unnamed_fields ( fields_unnamed) ,
14
+ syn:: Fields :: Unit => quote ! ( ) ,
15
+ }
16
+ }
17
+
18
+ pub fn read_enum_fields ( fields : & syn:: Fields )
10
19
-> TokenStream {
11
20
match * fields {
12
- syn:: Fields :: Named ( ref fields_named) => read_named_fields ( fields_named) ,
21
+ syn:: Fields :: Named ( ref fields_named) => read_named_fields_enum ( fields_named) ,
13
22
syn:: Fields :: Unnamed ( ref fields_unnamed) => read_unnamed_fields ( fields_unnamed) ,
14
23
syn:: Fields :: Unit => quote ! ( ) ,
15
24
}
@@ -24,12 +33,39 @@ pub fn write_fields(fields: &syn::Fields)
24
33
}
25
34
}
26
35
36
+ pub fn name_fields_declarations ( fields : & syn:: Fields ) -> TokenStream {
37
+ if let syn:: Fields :: Named ( ref fields_named) = fields {
38
+ let fields_variables: Vec < TokenStream > = fields_named. named . iter ( ) . map ( |field| {
39
+ let field_name = & field. ident ;
40
+ let field_ty = & field. ty ;
41
+ // This field may store the length prefix of one or more other field.
42
+ let update_hints = update_hints_after_read ( field, & fields_named. named ) ;
43
+ let update_hints_fixed = update_hint_fixed_length ( field, & fields_named. named ) ;
44
+
45
+ quote ! {
46
+ #update_hints_fixed
47
+ let #field_name: Result <#field_ty, _> = protocol:: Parcel :: read_field( __io_reader, __settings, & mut __hints) ;
48
+ let res = & #field_name;
49
+ #update_hints
50
+ __hints. next_field( ) ;
51
+ }
52
+ } ) . collect ( ) ;
53
+
54
+ quote ! {
55
+ #( #fields_variables) *
56
+ }
57
+ } else {
58
+ quote ! ( )
59
+ }
60
+
61
+ }
62
+
27
63
/// Generates code that builds a initializes
28
64
/// an item with named fields by parsing
29
65
/// each of the fields.
30
66
///
31
67
/// Returns `{ ..field initializers.. }`.
32
- fn read_named_fields ( fields_named : & syn:: FieldsNamed )
68
+ fn read_named_fields_enum ( fields_named : & syn:: FieldsNamed )
33
69
-> TokenStream {
34
70
let field_initializers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
35
71
let field_name = & field. ident ;
@@ -52,6 +88,21 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
52
88
quote ! { { #( #field_initializers ) , * } }
53
89
}
54
90
91
+ /// Generates code that builds a initializes
92
+ /// an item with named fields by parsing
93
+ /// each of the fields.
94
+ ///
95
+ /// Returns `{ ..field initializers.. }`.
96
+ fn read_named_fields_struct ( fields_named : & syn:: FieldsNamed )
97
+ -> TokenStream {
98
+ let field_initializers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
99
+ let field_name = & field. ident ;
100
+ quote ! { #field_name: #field_name? }
101
+ } ) . collect ( ) ;
102
+
103
+ quote ! { { #( #field_initializers ) , * } }
104
+ }
105
+
55
106
fn update_hints_after_read < ' a > ( field : & ' a syn:: Field ,
56
107
fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
57
108
-> TokenStream {
0 commit comments