@@ -47,33 +47,7 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
47
47
48
48
// Implement `DekuContainerWrite` for types that don't need a context
49
49
if input. ctx . is_none ( ) || ( input. ctx . is_some ( ) && input. ctx_default . is_some ( ) ) {
50
- let to_bits_body = wrap_default_ctx (
51
- quote ! {
52
- match * self {
53
- #destructured => {
54
- let mut __deku_acc: :: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 > = :: #crate_:: bitvec:: BitVec :: new( ) ;
55
- let __deku_output = & mut __deku_acc;
56
-
57
- #magic_write
58
- #( #field_writes) *
59
-
60
- Ok ( __deku_acc)
61
- }
62
- }
63
- } ,
64
- & input. ctx ,
65
- & input. ctx_default ,
66
- ) ;
67
-
68
50
tokens. extend ( quote ! {
69
- impl #imp core:: convert:: TryFrom <#ident> for :: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 > #wher {
70
- type Error = :: #crate_:: DekuError ;
71
-
72
- fn try_from( input: #ident) -> core:: result:: Result <Self , Self :: Error > {
73
- input. to_bits( )
74
- }
75
- }
76
-
77
51
impl #imp core:: convert:: TryFrom <#ident> for Vec <u8 > #wher {
78
52
type Error = :: #crate_:: DekuError ;
79
53
@@ -84,13 +58,11 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
84
58
85
59
impl #imp DekuContainerWrite for #ident #wher {
86
60
fn to_bytes( & self ) -> core:: result:: Result <Vec <u8 >, :: #crate_:: DekuError > {
87
- let mut acc: :: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 > = self . to_bits( ) ?;
88
- Ok ( acc. into_vec( ) )
89
- }
90
-
91
- #[ allow( unused_variables) ]
92
- fn to_bits( & self ) -> core:: result:: Result <:: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 >, :: #crate_:: DekuError > {
93
- #to_bits_body
61
+ let mut out_buf = vec![ ] ;
62
+ let mut __deku_writer = :: #crate_:: writer:: Writer :: new( & mut out_buf) ;
63
+ :: #crate_:: DekuWriter :: to_writer( self , & mut __deku_writer, ( ) ) ?;
64
+ __deku_writer. finalize( ) ?;
65
+ Ok ( out_buf)
94
66
}
95
67
}
96
68
} ) ;
@@ -122,9 +94,9 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
122
94
}
123
95
}
124
96
125
- impl #imp DekuWrite <#ctx_types> for #ident #wher {
97
+ impl #imp :: #crate_ :: DekuWriter <#ctx_types> for #ident #wher {
126
98
#[ allow( unused_variables) ]
127
- fn write ( & self , __deku_output : & mut :: #crate_:: bitvec :: BitVec < u8 , :: #crate_:: bitvec :: Msb0 >, #ctx_arg) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
99
+ fn to_writer< W : :: #crate_:: no_std_io :: Write > ( & self , __deku_writer : & mut :: #crate_:: writer :: Writer < W >, #ctx_arg) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
128
100
#write_body
129
101
}
130
102
}
@@ -134,9 +106,9 @@ fn emit_struct(input: &DekuData) -> Result<TokenStream, syn::Error> {
134
106
let write_body = wrap_default_ctx ( write_body, & input. ctx , & input. ctx_default ) ;
135
107
136
108
tokens. extend ( quote ! {
137
- impl #imp DekuWrite for #ident #wher {
109
+ impl #imp :: #crate_ :: DekuWriter for #ident #wher {
138
110
#[ allow( unused_variables) ]
139
- fn write ( & self , __deku_output : & mut :: #crate_:: bitvec :: BitVec < u8 , :: #crate_:: bitvec :: Msb0 >, _: ( ) ) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
111
+ fn to_writer< W : :: #crate_:: no_std_io :: Write > ( & self , __deku_writer : & mut :: #crate_:: writer :: Writer < W >, _: ( ) ) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
140
112
#write_body
141
113
}
142
114
}
@@ -200,13 +172,13 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
200
172
Id :: TokenStream ( v) => {
201
173
quote ! {
202
174
let mut __deku_variant_id: #id_type = #v;
203
- __deku_variant_id. write ( __deku_output , ( #id_args) ) ?;
175
+ __deku_variant_id. to_writer ( __deku_writer , ( #id_args) ) ?;
204
176
}
205
177
}
206
178
Id :: LitByteStr ( v) => {
207
179
quote ! {
208
180
let mut __deku_variant_id: #id_type = * #v;
209
- __deku_variant_id. write ( __deku_output , ( #id_args) ) ?;
181
+ __deku_variant_id. to_writer ( __deku_writer , ( #id_args) ) ?;
210
182
}
211
183
}
212
184
}
@@ -215,7 +187,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
215
187
} else if has_discriminant {
216
188
quote ! {
217
189
let mut __deku_variant_id: #id_type = Self :: #variant_ident as #id_type;
218
- __deku_variant_id. write ( __deku_output , ( #id_args) ) ?;
190
+ __deku_variant_id. to_writer ( __deku_writer , ( #id_args) ) ?;
219
191
}
220
192
} else {
221
193
return Err ( syn:: Error :: new (
@@ -260,32 +232,7 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
260
232
261
233
// Implement `DekuContainerWrite` for types that don't need a context
262
234
if input. ctx . is_none ( ) || ( input. ctx . is_some ( ) && input. ctx_default . is_some ( ) ) {
263
- let to_bits_body = wrap_default_ctx (
264
- quote ! {
265
- let mut __deku_acc: :: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 > = :: #crate_:: bitvec:: BitVec :: new( ) ;
266
- let __deku_output = & mut __deku_acc;
267
-
268
- #magic_write
269
-
270
- match self {
271
- #( #variant_writes) , *
272
- }
273
-
274
- Ok ( __deku_acc)
275
- } ,
276
- & input. ctx ,
277
- & input. ctx_default ,
278
- ) ;
279
-
280
235
tokens. extend ( quote ! {
281
- impl #imp core:: convert:: TryFrom <#ident> for :: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 > #wher {
282
- type Error = :: #crate_:: DekuError ;
283
-
284
- fn try_from( input: #ident) -> core:: result:: Result <Self , Self :: Error > {
285
- input. to_bits( )
286
- }
287
- }
288
-
289
236
impl #imp core:: convert:: TryFrom <#ident> for Vec <u8 > #wher {
290
237
type Error = :: #crate_:: DekuError ;
291
238
@@ -296,13 +243,11 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
296
243
297
244
impl #imp DekuContainerWrite for #ident #wher {
298
245
fn to_bytes( & self ) -> core:: result:: Result <Vec <u8 >, :: #crate_:: DekuError > {
299
- let mut acc: :: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 > = self . to_bits( ) ?;
300
- Ok ( acc. into_vec( ) )
301
- }
302
-
303
- #[ allow( unused_variables) ]
304
- fn to_bits( & self ) -> core:: result:: Result <:: #crate_:: bitvec:: BitVec <u8 , :: #crate_:: bitvec:: Msb0 >, :: #crate_:: DekuError > {
305
- #to_bits_body
246
+ let mut out_buf = vec![ ] ;
247
+ let mut __deku_writer = :: #crate_:: writer:: Writer :: new( & mut out_buf) ;
248
+ :: #crate_:: DekuWriter :: to_writer( self , & mut __deku_writer, ( ) ) ?;
249
+ __deku_writer. finalize( ) ?;
250
+ Ok ( out_buf)
306
251
}
307
252
}
308
253
} )
@@ -336,9 +281,9 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
336
281
}
337
282
}
338
283
339
- impl #imp DekuWrite <#ctx_types> for #ident #wher {
284
+ impl #imp :: #crate_ :: DekuWriter <#ctx_types> for #ident #wher {
340
285
#[ allow( unused_variables) ]
341
- fn write ( & self , __deku_output : & mut :: #crate_:: bitvec :: BitVec < u8 , :: #crate_:: bitvec :: Msb0 >, #ctx_arg) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
286
+ fn to_writer< W : :: #crate_:: no_std_io :: Write > ( & self , __deku_writer : & mut :: #crate_:: writer :: Writer < W >, #ctx_arg) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
342
287
#write_body
343
288
}
344
289
}
@@ -348,9 +293,9 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
348
293
let write_body = wrap_default_ctx ( write_body, & input. ctx , & input. ctx_default ) ;
349
294
350
295
tokens. extend ( quote ! {
351
- impl #imp DekuWrite for #ident #wher {
296
+ impl #imp :: #crate_ :: DekuWriter for #ident #wher {
352
297
#[ allow( unused_variables) ]
353
- fn write ( & self , __deku_output : & mut :: #crate_:: bitvec :: BitVec < u8 , :: #crate_:: bitvec :: Msb0 >, _: ( ) ) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
298
+ fn to_writer< W : :: #crate_:: no_std_io :: Write > ( & self , __deku_writer : & mut :: #crate_:: writer :: Writer < W >, _: ( ) ) -> core:: result:: Result <( ) , :: #crate_:: DekuError > {
354
299
#write_body
355
300
}
356
301
}
@@ -362,9 +307,10 @@ fn emit_enum(input: &DekuData) -> Result<TokenStream, syn::Error> {
362
307
}
363
308
364
309
fn emit_magic_write ( input : & DekuData ) -> TokenStream {
310
+ let crate_ = super :: get_crate_name ( ) ;
365
311
if let Some ( magic) = & input. magic {
366
312
quote ! {
367
- #magic . write ( __deku_output , ( ) ) ?;
313
+ :: #crate_ :: DekuWriter :: to_writer ( #magic , __deku_writer , ( ) ) ?;
368
314
}
369
315
} else {
370
316
quote ! { }
@@ -426,7 +372,7 @@ fn emit_bit_byte_offsets(
426
372
. any ( |v| token_contains_string ( v, "__deku_byte_offset" ) )
427
373
{
428
374
Some ( quote ! {
429
- let __deku_byte_offset = __deku_bit_offset / 8 ;
375
+ let __deku_byte_offset = __deku_writer . bits_written / 8 ;
430
376
} )
431
377
} else {
432
378
None
@@ -438,7 +384,7 @@ fn emit_bit_byte_offsets(
438
384
|| byte_offset. is_some ( )
439
385
{
440
386
Some ( quote ! {
441
- let __deku_bit_offset = __deku_output . len ( ) ;
387
+ let __deku_bit_offset = __deku_writer . bits_written ;
442
388
} )
443
389
} else {
444
390
None
@@ -458,8 +404,7 @@ fn emit_padding(bit_size: &TokenStream) -> TokenStream {
458
404
stringify!( #bit_size)
459
405
) )
460
406
) ?;
461
- let new_len = __deku_output. len( ) + __deku_pad;
462
- __deku_output. resize( new_len, false ) ;
407
+ __deku_writer. write_bits( :: #crate_:: bitvec:: bitvec![ u8 , :: #crate_:: bitvec:: Msb0 ; 0 ; __deku_pad] . as_bitslice( ) ) ?;
463
408
}
464
409
}
465
410
}
@@ -522,6 +467,14 @@ fn emit_field_write(
522
467
}
523
468
} ) ;
524
469
470
+ let trace_field_log = if cfg ! ( feature = "logging" ) {
471
+ quote ! {
472
+ log:: trace!( "Writing: {}.{}" , #ident, #field_ident_str) ;
473
+ }
474
+ } else {
475
+ quote ! { }
476
+ } ;
477
+
525
478
let field_write_func = if field_writer. is_some ( ) {
526
479
quote ! { #field_writer }
527
480
} else {
@@ -537,13 +490,13 @@ fn emit_field_write(
537
490
let field_type = & f. ty ;
538
491
quote ! {
539
492
let #field_ident: #field_type = #temp_value;
540
- :: #crate_:: DekuWrite :: write ( #object_prefix & #field_ident, __deku_output , ( #write_args) )
493
+ :: #crate_:: DekuWriter :: to_writer ( #object_prefix & #field_ident, __deku_writer , ( #write_args) )
541
494
}
542
495
} else {
543
496
quote ! { core:: result:: Result :: <( ) , :: #crate_:: DekuError >:: Ok ( ( ) ) }
544
497
}
545
498
} else {
546
- quote ! { :: #crate_:: DekuWrite :: write ( #object_prefix #field_ident, __deku_output , ( #write_args) ) }
499
+ quote ! { :: #crate_:: DekuWriter :: to_writer ( #object_prefix #field_ident, __deku_writer , ( #write_args) ) }
547
500
}
548
501
} ;
549
502
@@ -592,6 +545,7 @@ fn emit_field_write(
592
545
#bit_offset
593
546
#byte_offset
594
547
548
+ #trace_field_log
595
549
#field_assert
596
550
#field_assert_eq
597
551
0 commit comments