@@ -83,6 +83,16 @@ impl FromIterator<(Value, Value)> for Map {
83
83
}
84
84
}
85
85
86
+ impl IntoIterator for Map {
87
+ type Item = ( Value , Value ) ;
88
+
89
+ type IntoIter = <MapInner as IntoIterator >:: IntoIter ;
90
+
91
+ fn into_iter ( self ) -> Self :: IntoIter {
92
+ self . 0 . into_iter ( )
93
+ }
94
+ }
95
+
86
96
/// Note: equality is only given if both values and order of values match
87
97
impl Eq for Map { }
88
98
@@ -353,18 +363,45 @@ impl<'de> Deserializer<'de> for Value {
353
363
match self {
354
364
Value :: Bool ( b) => visitor. visit_bool ( b) ,
355
365
Value :: Char ( c) => visitor. visit_char ( c) ,
356
- Value :: Map ( m) => visitor. visit_map ( MapAccessor {
357
- keys : m. keys ( ) . cloned ( ) . rev ( ) . collect ( ) ,
358
- values : m. values ( ) . cloned ( ) . rev ( ) . collect ( ) ,
359
- } ) ,
366
+ Value :: Map ( m) => {
367
+ let old_len = m. len ( ) ;
368
+
369
+ let mut items: Vec < ( Value , Value ) > = m. into_iter ( ) . collect ( ) ;
370
+ items. reverse ( ) ;
371
+
372
+ let value = visitor. visit_map ( MapAccessor {
373
+ items : & mut items,
374
+ value : None ,
375
+ } ) ?;
376
+
377
+ if items. is_empty ( ) {
378
+ Ok ( value)
379
+ } else {
380
+ Err ( Error :: ExpectedDifferentLength {
381
+ expected : format ! ( "a map of length {}" , old_len - items. len( ) ) ,
382
+ found : old_len,
383
+ } )
384
+ }
385
+ }
360
386
Value :: Number ( Number :: Float ( ref f) ) => visitor. visit_f64 ( f. get ( ) ) ,
361
387
Value :: Number ( Number :: Integer ( i) ) => visitor. visit_i64 ( i) ,
362
388
Value :: Option ( Some ( o) ) => visitor. visit_some ( * o) ,
363
389
Value :: Option ( None ) => visitor. visit_none ( ) ,
364
390
Value :: String ( s) => visitor. visit_string ( s) ,
365
391
Value :: Seq ( mut seq) => {
392
+ let old_len = seq. len ( ) ;
393
+
366
394
seq. reverse ( ) ;
367
- visitor. visit_seq ( Seq { seq } )
395
+ let value = visitor. visit_seq ( Seq { seq : & mut seq } ) ?;
396
+
397
+ if seq. is_empty ( ) {
398
+ Ok ( value)
399
+ } else {
400
+ Err ( Error :: ExpectedDifferentLength {
401
+ expected : format ! ( "a sequence of length {}" , old_len - seq. len( ) ) ,
402
+ found : old_len,
403
+ } )
404
+ }
368
405
}
369
406
Value :: Unit => visitor. visit_unit ( ) ,
370
407
}
@@ -433,41 +470,48 @@ impl<'de> Deserializer<'de> for Value {
433
470
}
434
471
}
435
472
436
- struct MapAccessor {
437
- keys : Vec < Value > ,
438
- values : Vec < Value > ,
473
+ struct MapAccessor < ' a > {
474
+ items : & ' a mut Vec < ( Value , Value ) > ,
475
+ value : Option < Value > ,
439
476
}
440
477
441
- impl < ' de > MapAccess < ' de > for MapAccessor {
478
+ impl < ' a , ' de > MapAccess < ' de > for MapAccessor < ' a > {
442
479
type Error = Error ;
443
480
444
481
fn next_key_seed < K > ( & mut self , seed : K ) -> Result < Option < K :: Value > >
445
482
where
446
483
K : DeserializeSeed < ' de > ,
447
484
{
448
485
// The `Vec` is reversed, so we can pop to get the originally first element
449
- self . keys
450
- . pop ( )
451
- . map_or ( Ok ( None ) , |v| seed. deserialize ( v) . map ( Some ) )
486
+ match self . items . pop ( ) {
487
+ Some ( ( key, value) ) => {
488
+ self . value = Some ( value) ;
489
+ seed. deserialize ( key) . map ( Some )
490
+ }
491
+ None => Ok ( None ) ,
492
+ }
452
493
}
453
494
454
495
fn next_value_seed < V > ( & mut self , seed : V ) -> Result < V :: Value >
455
496
where
456
497
V : DeserializeSeed < ' de > ,
457
498
{
458
- // The `Vec` is reversed, so we can pop to get the originally first element
459
- self . values
460
- . pop ( )
461
- . map ( |v| seed. deserialize ( v) )
462
- . expect ( "Contract violation" )
499
+ match self . value . take ( ) {
500
+ Some ( value) => seed. deserialize ( value) ,
501
+ None => panic ! ( "Contract violation: value before key" ) ,
502
+ }
503
+ }
504
+
505
+ fn size_hint ( & self ) -> Option < usize > {
506
+ Some ( self . items . len ( ) )
463
507
}
464
508
}
465
509
466
- struct Seq {
467
- seq : Vec < Value > ,
510
+ struct Seq < ' a > {
511
+ seq : & ' a mut Vec < Value > ,
468
512
}
469
513
470
- impl < ' de > SeqAccess < ' de > for Seq {
514
+ impl < ' a , ' de > SeqAccess < ' de > for Seq < ' a > {
471
515
type Error = Error ;
472
516
473
517
fn next_element_seed < T > ( & mut self , seed : T ) -> Result < Option < T :: Value > >
@@ -479,6 +523,10 @@ impl<'de> SeqAccess<'de> for Seq {
479
523
. pop ( )
480
524
. map_or ( Ok ( None ) , |v| seed. deserialize ( v) . map ( Some ) )
481
525
}
526
+
527
+ fn size_hint ( & self ) -> Option < usize > {
528
+ Some ( self . seq . len ( ) )
529
+ }
482
530
}
483
531
484
532
#[ cfg( test) ]
0 commit comments