From 921419ff99ffd9681e0eecb9621f6f3d2918c47c Mon Sep 17 00:00:00 2001 From: Jordan Doyle Date: Sat, 24 Jul 2021 17:09:21 +0100 Subject: [PATCH] Implement support for tuples --- src/lib.rs | 2 ++ src/ser.rs | 33 +++++++++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 42461a1..5ee98d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,6 +39,7 @@ mod test { a: Vec<&'a str>, e: Test, e2: Test, + t: (i32, i32, i32), } let test = &A { @@ -50,6 +51,7 @@ mod test { a: vec!["yooo", "mayn"], e: Test::Abc, e2: Test::Def(1999), + t: (16, 07, 1999), }, }; diff --git a/src/ser.rs b/src/ser.rs index 825db03..735bc24 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -1,6 +1,9 @@ use crate::Error; use bytes::{BufMut, BytesMut}; -use serde::{ser::SerializeStruct, Serialize}; +use serde::{ + ser::{SerializeSeq, SerializeStruct}, + Serialize, +}; use std::convert::TryFrom; pub struct Serializer<'a> { @@ -25,7 +28,7 @@ impl<'a> serde::Serializer for Serializer<'a> { type Error = Error; type SerializeSeq = SeqSerializer<'a>; - type SerializeTuple = serde::ser::Impossible; + type SerializeTuple = TupleSerializer<'a>; type SerializeTupleStruct = serde::ser::Impossible; type SerializeTupleVariant = serde::ser::Impossible; type SerializeMap = serde::ser::Impossible; @@ -193,8 +196,10 @@ impl<'a> serde::Serializer for Serializer<'a> { }) } - fn serialize_tuple(self, _len: usize) -> Result { - todo!("tuple") + fn serialize_tuple(self, len: usize) -> Result { + Ok(TupleSerializer { + inner: self.serialize_seq(Some(len))?, + }) } fn serialize_tuple_struct( @@ -247,6 +252,26 @@ impl<'a> serde::Serializer for Serializer<'a> { } } +pub struct TupleSerializer<'a> { + inner: SeqSerializer<'a>, +} + +impl<'a> serde::ser::SerializeTuple for TupleSerializer<'a> { + type Ok = (); + type Error = as serde::Serializer>::Error; + + fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> + where + T: Serialize, + { + self.inner.serialize_element(value) + } + + fn end(self) -> Result { + self.inner.end() + } +} + pub struct SeqSerializer<'a> { original_output: &'a mut BytesMut, doc_output: BytesMut, -- libgit2 1.7.2