@@ -4,6 +4,7 @@ use serde::{
44 Serialize ,
55 ser:: { self , SerializeSeq , SerializeTuple , Serializer } ,
66} ;
7+ use serde:: ser:: SerializeTupleStruct ;
78use thiserror:: Error ;
89
910use super :: escape;
@@ -80,7 +81,7 @@ impl<'a, W: Write> Serializer for SqlSerializer<'a, W> {
8081 type SerializeStruct = Impossible ;
8182 type SerializeStructVariant = Impossible ;
8283 type SerializeTuple = SqlListSerializer < ' a , W > ;
83- type SerializeTupleStruct = Impossible ;
84+ type SerializeTupleStruct = SqlListSerializer < ' a , W > ;
8485 type SerializeTupleVariant = Impossible ;
8586
8687 unsupported ! (
@@ -196,8 +197,13 @@ impl<'a, W: Write> Serializer for SqlSerializer<'a, W> {
196197 }
197198
198199 #[ inline]
199- fn serialize_tuple_struct ( self , _name : & ' static str , _len : usize ) -> Result < Impossible > {
200- Err ( SerializerError :: Unsupported ( "serialize_tuple_struct" ) )
200+ fn serialize_tuple_struct ( self , _name : & ' static str , _len : usize ) -> Result < SqlListSerializer < ' a , W > > {
201+ self . writer . write_char ( '(' ) ?;
202+ Ok ( SqlListSerializer {
203+ writer : self . writer ,
204+ has_items : false ,
205+ closing_char : ')' ,
206+ } )
201207 }
202208
203209 #[ inline]
@@ -286,6 +292,24 @@ impl<W: Write> SerializeTuple for SqlListSerializer<'_, W> {
286292 }
287293}
288294
295+ impl < W : Write > SerializeTupleStruct for SqlListSerializer < ' _ , W > {
296+ type Error = SerializerError ;
297+ type Ok = ( ) ;
298+
299+ #[ inline]
300+ fn serialize_field < T > ( & mut self , value : & T ) -> Result
301+ where
302+ T : Serialize + ?Sized ,
303+ {
304+ SerializeSeq :: serialize_element ( self , value)
305+ }
306+
307+ #[ inline]
308+ fn end ( self ) -> Result {
309+ SerializeSeq :: end ( self )
310+ }
311+ }
312+
289313// === ParamSerializer ===
290314
291315struct ParamSerializer < ' a , W > {
@@ -543,6 +567,13 @@ mod tests {
543567 assert_eq ! ( check( ( 42 , 43 ) ) , "(42,43)" ) ;
544568 }
545569
570+ #[ test]
571+ fn it_writes_tuple_structs ( ) {
572+ #[ derive( Serialize ) ]
573+ struct T ( u32 , u32 ) ;
574+ assert_eq ! ( check( T ( 42 , 43 ) ) , "(42,43)" ) ;
575+ }
576+
546577 #[ test]
547578 fn it_writes_options ( ) {
548579 assert_eq ! ( check( None :: <i32 >) , "NULL" ) ;
@@ -566,10 +597,6 @@ mod tests {
566597 }
567598 assert ! ( write_arg( & mut out, & Struct { a: 42 } ) . is_err( ) ) ;
568599
569- #[ derive( Serialize ) ]
570- struct TupleStruct ( u32 , u32 ) ;
571- assert ! ( write_arg( & mut out, & TupleStruct ( 42 , 42 ) ) . is_err( ) ) ;
572-
573600 #[ derive( Serialize ) ]
574601 enum Enum {
575602 Newtype ( u32 ) ,
0 commit comments