@@ -28,15 +28,17 @@ pub fn write_fields(fields: &syn::Fields)
28
28
///
29
29
/// Returns `{ ..field initializers.. }`.
30
30
fn read_named_fields ( fields_named : & syn:: FieldsNamed )
31
- -> TokenStream {
31
+ -> TokenStream {
32
32
let field_initializers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
33
33
let field_name = & field. ident ;
34
34
let field_ty = & field. ty ;
35
35
// This field may store the length prefix of another field.
36
36
let update_hints = update_hints_after_read ( field, & fields_named. named ) ;
37
+ let update_hints_fixed = update_hints__fixed_after_read ( field, & fields_named. named ) ;
37
38
38
39
quote ! {
39
40
#field_name : {
41
+ #update_hints_fixed
40
42
let res: Result <#field_ty, _> = protocol:: Parcel :: read_field( __io_reader, __settings, & mut __hints) ;
41
43
#update_hints
42
44
__hints. next_field( ) ;
@@ -50,17 +52,32 @@ fn read_named_fields(fields_named: &syn::FieldsNamed)
50
52
51
53
fn update_hints_after_read < ' a > ( field : & ' a syn:: Field ,
52
54
fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
53
- -> TokenStream {
55
+ -> TokenStream {
54
56
if let Some ( ( length_prefix_of, kind, prefix_subfield_names) ) = length_prefix_of ( field, fields. clone ( ) ) {
55
57
let kind = kind. path_expr ( ) ;
56
58
57
59
quote ! {
58
60
if let Ok ( parcel) = res. as_ref( ) {
59
- __hints. set_field_length( #length_prefix_of,
60
- ( parcel #( . #prefix_subfield_names) * ) . clone( ) as usize ,
61
- #kind) ;
61
+ __hints. set_field_length( #length_prefix_of,
62
+ ( parcel #( . #prefix_subfield_names) * ) . clone( ) as usize ,
63
+ #kind) ;
62
64
}
63
65
}
66
+ } else {
67
+ quote ! { }
68
+ }
69
+ }
70
+
71
+ fn update_hints__fixed_after_read < ' a > ( field : & ' a syn:: Field ,
72
+ fields : impl IntoIterator < Item =& ' a syn:: Field > + Clone )
73
+ -> TokenStream {
74
+
75
+ if let Some ( attr:: Protocol :: FixedLength ( length) ) = attr:: protocol ( & field. attrs ) {
76
+ let position = fields. clone ( ) . into_iter ( ) . position ( |f| f == field) . unwrap ( ) ;
77
+
78
+ quote ! {
79
+ __hints. set_field_length( #position, #length, protocol:: hint:: LengthPrefixKind :: Elements ) ;
80
+ }
64
81
} else {
65
82
quote ! { }
66
83
}
@@ -123,14 +140,16 @@ fn length_prefix_of<'a>(field: &'a syn::Field,
123
140
}
124
141
125
142
fn write_named_fields ( fields_named : & syn:: FieldsNamed )
126
- -> TokenStream {
143
+ -> TokenStream {
127
144
let field_writers: Vec < _ > = fields_named. named . iter ( ) . map ( |field| {
128
145
let field_name = & field. ident ;
129
146
// This field may store the length prefix of another field.
130
147
let update_hints = update_hints_after_write ( field, & fields_named. named ) ;
148
+ let update_hints_fixed = update_hints__fixed_after_read ( field, & fields_named. named ) ;
131
149
132
150
quote ! {
133
151
{
152
+ #update_hints_fixed
134
153
let res = protocol:: Parcel :: write_field( & self . #field_name, __io_writer, __settings, & mut __hints) ;
135
154
#update_hints
136
155
__hints. next_field( ) ;
0 commit comments