@@ -333,35 +333,55 @@ impl<'a, 'de> Visitor<'de> for TupleStructVisitor<'a> {
333
333
}
334
334
}
335
335
336
- struct ListVisitor < ' a > {
337
- list_info : & ' a ListInfo ,
336
+ struct TupleVisitor < ' a > {
337
+ tuple_info : & ' a TupleInfo ,
338
338
registry : & ' a TypeRegistry ,
339
339
}
340
340
341
- impl < ' a , ' de > Visitor < ' de > for ListVisitor < ' a > {
342
- type Value = DynamicList ;
341
+ impl < ' a , ' de > Visitor < ' de > for TupleVisitor < ' a > {
342
+ type Value = DynamicTuple ;
343
343
344
344
fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
345
- formatter. write_str ( "reflected list value" )
345
+ formatter. write_str ( "reflected tuple value" )
346
346
}
347
347
348
348
fn visit_seq < V > ( self , mut seq : V ) -> Result < Self :: Value , V :: Error >
349
349
where
350
350
V : SeqAccess < ' de > ,
351
351
{
352
- let mut list = DynamicList :: default ( ) ;
353
- let type_info = get_type_info (
354
- self . list_info . item_type_id ( ) ,
355
- self . list_info . item_type_name ( ) ,
356
- self . registry ,
357
- ) ?;
352
+ let mut tuple = DynamicTuple :: default ( ) ;
353
+ let mut index = 0usize ;
354
+
355
+ let get_field_info = |index : usize | -> Result < & ' a TypeInfo , V :: Error > {
356
+ let field = self . tuple_info . field_at ( index) . ok_or_else ( || {
357
+ de:: Error :: custom ( format_args ! (
358
+ "no field at index {} on tuple {}" ,
359
+ index,
360
+ self . tuple_info. type_name( ) ,
361
+ ) )
362
+ } ) ?;
363
+ get_type_info ( field. type_id ( ) , field. type_name ( ) , self . registry )
364
+ } ;
365
+
358
366
while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
359
- type_info,
367
+ type_info : get_field_info ( index ) ? ,
360
368
registry : self . registry ,
361
369
} ) ? {
362
- list. push_box ( value) ;
370
+ tuple. insert_boxed ( value) ;
371
+ index += 1 ;
372
+ if index >= self . tuple_info . field_len ( ) {
373
+ break ;
374
+ }
363
375
}
364
- Ok ( list)
376
+
377
+ if tuple. field_len ( ) != self . tuple_info . field_len ( ) {
378
+ return Err ( Error :: invalid_length (
379
+ tuple. field_len ( ) ,
380
+ & self . tuple_info . field_len ( ) . to_string ( ) . as_str ( ) ,
381
+ ) ) ;
382
+ }
383
+
384
+ Ok ( tuple)
365
385
}
366
386
}
367
387
@@ -405,6 +425,38 @@ impl<'a, 'de> Visitor<'de> for ArrayVisitor<'a> {
405
425
}
406
426
}
407
427
428
+ struct ListVisitor < ' a > {
429
+ list_info : & ' a ListInfo ,
430
+ registry : & ' a TypeRegistry ,
431
+ }
432
+
433
+ impl < ' a , ' de > Visitor < ' de > for ListVisitor < ' a > {
434
+ type Value = DynamicList ;
435
+
436
+ fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
437
+ formatter. write_str ( "reflected list value" )
438
+ }
439
+
440
+ fn visit_seq < V > ( self , mut seq : V ) -> Result < Self :: Value , V :: Error >
441
+ where
442
+ V : SeqAccess < ' de > ,
443
+ {
444
+ let mut list = DynamicList :: default ( ) ;
445
+ let type_info = get_type_info (
446
+ self . list_info . item_type_id ( ) ,
447
+ self . list_info . item_type_name ( ) ,
448
+ self . registry ,
449
+ ) ?;
450
+ while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
451
+ type_info,
452
+ registry : self . registry ,
453
+ } ) ? {
454
+ list. push_box ( value) ;
455
+ }
456
+ Ok ( list)
457
+ }
458
+ }
459
+
408
460
struct MapVisitor < ' a > {
409
461
map_info : & ' a MapInfo ,
410
462
registry : & ' a TypeRegistry ,
@@ -447,58 +499,6 @@ impl<'a, 'de> Visitor<'de> for MapVisitor<'a> {
447
499
}
448
500
}
449
501
450
- struct TupleVisitor < ' a > {
451
- tuple_info : & ' a TupleInfo ,
452
- registry : & ' a TypeRegistry ,
453
- }
454
-
455
- impl < ' a , ' de > Visitor < ' de > for TupleVisitor < ' a > {
456
- type Value = DynamicTuple ;
457
-
458
- fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
459
- formatter. write_str ( "reflected tuple value" )
460
- }
461
-
462
- fn visit_seq < V > ( self , mut seq : V ) -> Result < Self :: Value , V :: Error >
463
- where
464
- V : SeqAccess < ' de > ,
465
- {
466
- let mut tuple = DynamicTuple :: default ( ) ;
467
- let mut index = 0usize ;
468
-
469
- let get_field_info = |index : usize | -> Result < & ' a TypeInfo , V :: Error > {
470
- let field = self . tuple_info . field_at ( index) . ok_or_else ( || {
471
- de:: Error :: custom ( format_args ! (
472
- "no field at index {} on tuple {}" ,
473
- index,
474
- self . tuple_info. type_name( ) ,
475
- ) )
476
- } ) ?;
477
- get_type_info ( field. type_id ( ) , field. type_name ( ) , self . registry )
478
- } ;
479
-
480
- while let Some ( value) = seq. next_element_seed ( TypedReflectDeserializer {
481
- type_info : get_field_info ( index) ?,
482
- registry : self . registry ,
483
- } ) ? {
484
- tuple. insert_boxed ( value) ;
485
- index += 1 ;
486
- if index >= self . tuple_info . field_len ( ) {
487
- break ;
488
- }
489
- }
490
-
491
- if tuple. field_len ( ) != self . tuple_info . field_len ( ) {
492
- return Err ( Error :: invalid_length (
493
- tuple. field_len ( ) ,
494
- & self . tuple_info . field_len ( ) . to_string ( ) . as_str ( ) ,
495
- ) ) ;
496
- }
497
-
498
- Ok ( tuple)
499
- }
500
- }
501
-
502
502
fn get_type_info < ' a , E : de:: Error > (
503
503
type_id : TypeId ,
504
504
type_name : & ' a str ,
@@ -657,7 +657,9 @@ mod tests {
657
657
let dynamic_output = reflect_deserializer
658
658
. deserialize ( & mut ron_deserializer)
659
659
. unwrap ( ) ;
660
- let output = dynamic_output. take :: < f32 > ( ) . expect ( "underlying type should be f32" ) ;
660
+ let output = dynamic_output
661
+ . take :: < f32 > ( )
662
+ . expect ( "underlying type should be f32" ) ;
661
663
assert_eq ! ( 1.23 , output) ;
662
664
}
663
665
0 commit comments