Skip to content

Commit 38f638f

Browse files
Merge #571
571: Provide length when serializing sequence r=jonasbb a=stephaneyfx Some serializers (e.g. bincode) require a length to serialize a sequence. This code does what `iterator_len_hint` does (called by `collect_seq` in `serde`). Resolves #570 Co-authored-by: Stephane Raux <[email protected]>
2 parents d62e486 + 0a27e24 commit 38f638f

File tree

1 file changed

+333
-0
lines changed

1 file changed

+333
-0
lines changed

serde_with/tests/serde_as/map_tuple_list.rs

Lines changed: 333 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,336 @@ fn test_map_as_tuple_with_nested_complex_type() {
352352
]"#]],
353353
);
354354
}
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

Comments
 (0)