@@ -352,3 +352,336 @@ fn test_map_as_tuple_with_nested_complex_type() {
352
352
]"# ] ] ,
353
353
) ;
354
354
}
355
+
356
+ #[ test]
357
+ fn test_map_as_tuple_list_works_with_serializer_that_needs_length_to_serialize_sequence ( ) {
358
+ use serde:: {
359
+ ser:: {
360
+ SerializeMap , SerializeSeq , SerializeStruct , SerializeStructVariant , SerializeTuple ,
361
+ SerializeTupleStruct , SerializeTupleVariant ,
362
+ } ,
363
+ Serializer ,
364
+ } ;
365
+ use std:: fmt:: { self , Debug , Display } ;
366
+
367
+ #[ derive( Debug ) ]
368
+ enum TestError {
369
+ LengthRequired ,
370
+ Other ,
371
+ }
372
+
373
+ impl Display for TestError {
374
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
375
+ Debug :: fmt ( self , f)
376
+ }
377
+ }
378
+
379
+ impl std:: error:: Error for TestError { }
380
+
381
+ impl serde:: ser:: Error for TestError {
382
+ fn custom < T > ( _: T ) -> Self
383
+ where
384
+ T : Display ,
385
+ {
386
+ TestError :: Other
387
+ }
388
+ }
389
+
390
+ struct TestSerializer ;
391
+
392
+ impl < ' a > Serializer for & ' a mut TestSerializer {
393
+ type Ok = ( ) ;
394
+ type Error = TestError ;
395
+ type SerializeSeq = Self ;
396
+ type SerializeTuple = Self ;
397
+ type SerializeTupleStruct = Self ;
398
+ type SerializeTupleVariant = Self ;
399
+ type SerializeMap = Self ;
400
+ type SerializeStruct = Self ;
401
+ type SerializeStructVariant = Self ;
402
+
403
+ fn serialize_bool ( self , _: bool ) -> Result < Self :: Ok , Self :: Error > {
404
+ Ok ( ( ) )
405
+ }
406
+
407
+ fn serialize_i8 ( self , _: i8 ) -> Result < Self :: Ok , Self :: Error > {
408
+ Ok ( ( ) )
409
+ }
410
+
411
+ fn serialize_i16 ( self , _: i16 ) -> Result < Self :: Ok , Self :: Error > {
412
+ Ok ( ( ) )
413
+ }
414
+
415
+ fn serialize_i32 ( self , _: i32 ) -> Result < Self :: Ok , Self :: Error > {
416
+ Ok ( ( ) )
417
+ }
418
+
419
+ fn serialize_i64 ( self , _: i64 ) -> Result < Self :: Ok , Self :: Error > {
420
+ Ok ( ( ) )
421
+ }
422
+
423
+ fn serialize_u8 ( self , _: u8 ) -> Result < Self :: Ok , Self :: Error > {
424
+ Ok ( ( ) )
425
+ }
426
+
427
+ fn serialize_u16 ( self , _: u16 ) -> Result < Self :: Ok , Self :: Error > {
428
+ Ok ( ( ) )
429
+ }
430
+
431
+ fn serialize_u32 ( self , _: u32 ) -> Result < Self :: Ok , Self :: Error > {
432
+ Ok ( ( ) )
433
+ }
434
+
435
+ fn serialize_u64 ( self , _: u64 ) -> Result < Self :: Ok , Self :: Error > {
436
+ Ok ( ( ) )
437
+ }
438
+
439
+ fn serialize_f32 ( self , _: f32 ) -> Result < Self :: Ok , Self :: Error > {
440
+ Ok ( ( ) )
441
+ }
442
+
443
+ fn serialize_f64 ( self , _: f64 ) -> Result < Self :: Ok , Self :: Error > {
444
+ Ok ( ( ) )
445
+ }
446
+
447
+ fn serialize_char ( self , _: char ) -> Result < Self :: Ok , Self :: Error > {
448
+ Ok ( ( ) )
449
+ }
450
+
451
+ fn serialize_str ( self , _: & str ) -> Result < Self :: Ok , Self :: Error > {
452
+ Ok ( ( ) )
453
+ }
454
+
455
+ fn serialize_bytes ( self , _: & [ u8 ] ) -> Result < Self :: Ok , Self :: Error > {
456
+ Ok ( ( ) )
457
+ }
458
+
459
+ fn serialize_none ( self ) -> Result < Self :: Ok , Self :: Error > {
460
+ Ok ( ( ) )
461
+ }
462
+
463
+ fn serialize_some < T > ( self , v : & T ) -> Result < Self :: Ok , Self :: Error >
464
+ where
465
+ T : Serialize + ?Sized ,
466
+ {
467
+ v. serialize ( self )
468
+ }
469
+
470
+ fn serialize_unit ( self ) -> Result < Self :: Ok , Self :: Error > {
471
+ Ok ( ( ) )
472
+ }
473
+
474
+ fn serialize_unit_struct ( self , _: & ' static str ) -> Result < Self :: Ok , Self :: Error > {
475
+ Ok ( ( ) )
476
+ }
477
+
478
+ fn serialize_unit_variant (
479
+ self ,
480
+ _: & ' static str ,
481
+ _: u32 ,
482
+ _: & ' static str ,
483
+ ) -> Result < Self :: Ok , Self :: Error > {
484
+ Ok ( ( ) )
485
+ }
486
+
487
+ fn serialize_newtype_struct < T > (
488
+ self ,
489
+ _: & ' static str ,
490
+ value : & T ,
491
+ ) -> Result < Self :: Ok , Self :: Error >
492
+ where
493
+ T : Serialize + ?Sized ,
494
+ {
495
+ value. serialize ( self )
496
+ }
497
+
498
+ fn serialize_newtype_variant < T > (
499
+ self ,
500
+ _: & ' static str ,
501
+ _: u32 ,
502
+ _: & ' static str ,
503
+ value : & T ,
504
+ ) -> Result < Self :: Ok , Self :: Error >
505
+ where
506
+ T : Serialize + ?Sized ,
507
+ {
508
+ value. serialize ( self )
509
+ }
510
+
511
+ fn serialize_seq ( self , len : Option < usize > ) -> Result < Self :: SerializeSeq , Self :: Error > {
512
+ len. map ( |_| self ) . ok_or ( TestError :: LengthRequired )
513
+ }
514
+
515
+ fn serialize_tuple ( self , _: usize ) -> Result < Self :: SerializeTuple , Self :: Error > {
516
+ Ok ( self )
517
+ }
518
+
519
+ fn serialize_tuple_struct (
520
+ self ,
521
+ _: & ' static str ,
522
+ _: usize ,
523
+ ) -> Result < Self :: SerializeTupleStruct , Self :: Error > {
524
+ Ok ( self )
525
+ }
526
+
527
+ fn serialize_tuple_variant (
528
+ self ,
529
+ _: & ' static str ,
530
+ _: u32 ,
531
+ _: & ' static str ,
532
+ _: usize ,
533
+ ) -> Result < Self :: SerializeTupleVariant , Self :: Error > {
534
+ Ok ( self )
535
+ }
536
+
537
+ fn serialize_map ( self , _: Option < usize > ) -> Result < Self :: SerializeMap , Self :: Error > {
538
+ Ok ( self )
539
+ }
540
+
541
+ fn serialize_struct (
542
+ self ,
543
+ _: & ' static str ,
544
+ _: usize ,
545
+ ) -> Result < Self :: SerializeStruct , Self :: Error > {
546
+ Ok ( self )
547
+ }
548
+
549
+ fn serialize_struct_variant (
550
+ self ,
551
+ _: & ' static str ,
552
+ _: u32 ,
553
+ _: & ' static str ,
554
+ _: usize ,
555
+ ) -> Result < Self :: SerializeStructVariant , Self :: Error > {
556
+ Ok ( self )
557
+ }
558
+ }
559
+
560
+ impl < ' a > SerializeMap for & ' a mut TestSerializer {
561
+ type Ok = ( ) ;
562
+ type Error = TestError ;
563
+
564
+ fn serialize_key < T > ( & mut self , key : & T ) -> Result < ( ) , Self :: Error >
565
+ where
566
+ T : Serialize + ?Sized ,
567
+ {
568
+ key. serialize ( & mut * * self )
569
+ }
570
+
571
+ fn serialize_value < T > ( & mut self , value : & T ) -> Result < ( ) , Self :: Error >
572
+ where
573
+ T : Serialize + ?Sized ,
574
+ {
575
+ value. serialize ( & mut * * self )
576
+ }
577
+
578
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
579
+ Ok ( ( ) )
580
+ }
581
+ }
582
+
583
+ impl < ' a > SerializeSeq for & ' a mut TestSerializer {
584
+ type Ok = ( ) ;
585
+ type Error = TestError ;
586
+
587
+ fn serialize_element < T > ( & mut self , value : & T ) -> Result < ( ) , Self :: Error >
588
+ where
589
+ T : Serialize + ?Sized ,
590
+ {
591
+ value. serialize ( & mut * * self )
592
+ }
593
+
594
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
595
+ Ok ( ( ) )
596
+ }
597
+ }
598
+
599
+ impl < ' a > SerializeStruct for & ' a mut TestSerializer {
600
+ type Ok = ( ) ;
601
+ type Error = TestError ;
602
+
603
+ fn serialize_field < T > ( & mut self , _: & ' static str , value : & T ) -> Result < ( ) , Self :: Error >
604
+ where
605
+ T : Serialize + ?Sized ,
606
+ {
607
+ value. serialize ( & mut * * self )
608
+ }
609
+
610
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
611
+ Ok ( ( ) )
612
+ }
613
+ }
614
+
615
+ impl < ' a > SerializeStructVariant for & ' a mut TestSerializer {
616
+ type Ok = ( ) ;
617
+ type Error = TestError ;
618
+
619
+ fn serialize_field < T > ( & mut self , _: & ' static str , value : & T ) -> Result < ( ) , Self :: Error >
620
+ where
621
+ T : Serialize + ?Sized ,
622
+ {
623
+ value. serialize ( & mut * * self )
624
+ }
625
+
626
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
627
+ Ok ( ( ) )
628
+ }
629
+ }
630
+
631
+ impl < ' a > SerializeTuple for & ' a mut TestSerializer {
632
+ type Ok = ( ) ;
633
+ type Error = TestError ;
634
+
635
+ fn serialize_element < T > ( & mut self , value : & T ) -> Result < ( ) , Self :: Error >
636
+ where
637
+ T : Serialize + ?Sized ,
638
+ {
639
+ value. serialize ( & mut * * self )
640
+ }
641
+
642
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
643
+ Ok ( ( ) )
644
+ }
645
+ }
646
+
647
+ impl < ' a > SerializeTupleStruct for & ' a mut TestSerializer {
648
+ type Ok = ( ) ;
649
+ type Error = TestError ;
650
+
651
+ fn serialize_field < T > ( & mut self , value : & T ) -> Result < ( ) , Self :: Error >
652
+ where
653
+ T : Serialize + ?Sized ,
654
+ {
655
+ value. serialize ( & mut * * self )
656
+ }
657
+
658
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
659
+ Ok ( ( ) )
660
+ }
661
+ }
662
+
663
+ impl < ' a > SerializeTupleVariant for & ' a mut TestSerializer {
664
+ type Ok = ( ) ;
665
+ type Error = TestError ;
666
+
667
+ fn serialize_field < T > ( & mut self , value : & T ) -> Result < ( ) , Self :: Error >
668
+ where
669
+ T : Serialize + ?Sized ,
670
+ {
671
+ value. serialize ( & mut * * self )
672
+ }
673
+
674
+ fn end ( self ) -> Result < Self :: Ok , Self :: Error > {
675
+ Ok ( ( ) )
676
+ }
677
+ }
678
+
679
+ #[ serde_as]
680
+ #[ derive( Debug , Default , Serialize ) ]
681
+ struct Data {
682
+ #[ serde_as( as = "Seq<(_, _)>" ) ]
683
+ xs : HashMap < i32 , i32 > ,
684
+ }
685
+
686
+ Data :: default ( ) . serialize ( & mut TestSerializer ) . unwrap ( ) ;
687
+ }
0 commit comments