@@ -2,7 +2,7 @@ use std::fmt::{self, Write};
22
33use serde:: {
44 Serialize ,
5- ser:: { self , SerializeSeq , SerializeTuple , Serializer } ,
5+ ser:: { self , SerializeSeq , SerializeTuple , SerializeTupleStruct , Serializer } ,
66} ;
77use thiserror:: Error ;
88
@@ -80,7 +80,7 @@ impl<'a, W: Write> Serializer for SqlSerializer<'a, W> {
8080 type SerializeStruct = Impossible ;
8181 type SerializeStructVariant = Impossible ;
8282 type SerializeTuple = SqlListSerializer < ' a , W > ;
83- type SerializeTupleStruct = Impossible ;
83+ type SerializeTupleStruct = SqlListSerializer < ' a , W > ;
8484 type SerializeTupleVariant = Impossible ;
8585
8686 unsupported ! (
@@ -196,8 +196,13 @@ impl<'a, W: Write> Serializer for SqlSerializer<'a, W> {
196196 }
197197
198198 #[ inline]
199- fn serialize_tuple_struct ( self , _name : & ' static str , _len : usize ) -> Result < Impossible > {
200- Err ( SerializerError :: Unsupported ( "serialize_tuple_struct" ) )
199+ fn serialize_tuple_struct ( self , _name : & ' static str , _len : usize ) -> Result < SqlListSerializer < ' a , W > > {
200+ self . writer . write_char ( '(' ) ?;
201+ Ok ( SqlListSerializer {
202+ writer : self . writer ,
203+ has_items : false ,
204+ closing_char : ')' ,
205+ } )
201206 }
202207
203208 #[ inline]
@@ -286,6 +291,24 @@ impl<W: Write> SerializeTuple for SqlListSerializer<'_, W> {
286291 }
287292}
288293
294+ impl < W : Write > SerializeTupleStruct for SqlListSerializer < ' _ , W > {
295+ type Error = SerializerError ;
296+ type Ok = ( ) ;
297+
298+ #[ inline]
299+ fn serialize_field < T > ( & mut self , value : & T ) -> Result
300+ where
301+ T : Serialize + ?Sized ,
302+ {
303+ SerializeSeq :: serialize_element ( self , value)
304+ }
305+
306+ #[ inline]
307+ fn end ( self ) -> Result {
308+ SerializeSeq :: end ( self )
309+ }
310+ }
311+
289312// === ParamSerializer ===
290313
291314struct ParamSerializer < ' a , W > {
@@ -543,6 +566,13 @@ mod tests {
543566 assert_eq ! ( check( ( 42 , 43 ) ) , "(42,43)" ) ;
544567 }
545568
569+ #[ test]
570+ fn it_writes_tuple_structs ( ) {
571+ #[ derive( Serialize ) ]
572+ struct T ( u32 , u32 ) ;
573+ assert_eq ! ( check( T ( 42 , 43 ) ) , "(42,43)" ) ;
574+ }
575+
546576 #[ test]
547577 fn it_writes_options ( ) {
548578 assert_eq ! ( check( None :: <i32 >) , "NULL" ) ;
@@ -566,10 +596,6 @@ mod tests {
566596 }
567597 assert ! ( write_arg( & mut out, & Struct { a: 42 } ) . is_err( ) ) ;
568598
569- #[ derive( Serialize ) ]
570- struct TupleStruct ( u32 , u32 ) ;
571- assert ! ( write_arg( & mut out, & TupleStruct ( 42 , 42 ) ) . is_err( ) ) ;
572-
573599 #[ derive( Serialize ) ]
574600 enum Enum {
575601 Newtype ( u32 ) ,
0 commit comments