@@ -178,7 +178,7 @@ impl<'a, 'b: 'a> ser::Serializer for &'a mut Serializer<'b> {
178178 type Error = Error ;
179179 type SerializeSeq = SerializeSeq < ' a , ' b > ;
180180 type SerializeTuple = SerializeSeq < ' a , ' b > ;
181- type SerializeTupleStruct = Unreachable ;
181+ type SerializeTupleStruct = SerializeSeq < ' a , ' b > ;
182182 type SerializeTupleVariant = Unreachable ;
183183 type SerializeMap = SerializeMap < ' a , ' b > ;
184184 type SerializeStruct = SerializeStruct < ' a , ' b > ;
@@ -385,9 +385,9 @@ impl<'a, 'b: 'a> ser::Serializer for &'a mut Serializer<'b> {
385385 fn serialize_tuple_struct (
386386 self ,
387387 _name : & ' static str ,
388- _len : usize ,
388+ len : usize ,
389389 ) -> Result < Self :: SerializeTupleStruct > {
390- unreachable ! ( )
390+ self . serialize_seq ( Some ( len ) )
391391 }
392392
393393 fn serialize_tuple_variant (
@@ -822,6 +822,32 @@ mod tests {
822822 ) ;
823823 }
824824
825+ #[ test]
826+ fn test_tuple_struct ( ) {
827+ #[ derive( Serialize ) ]
828+ struct A < ' a > ( u32 , Option < & ' a str > , u16 , bool ) ;
829+
830+ let a = A ( 42 , Some ( "A string" ) , 720 , false ) ;
831+
832+ assert_eq ! (
833+ & * crate :: to_string:: <_, N >( & a) . unwrap( ) ,
834+ r#"[42,"A string",720,false]"#
835+ ) ;
836+ }
837+
838+ #[ test]
839+ fn test_tuple_struct_roundtrip ( ) {
840+ use serde_derive:: Deserialize ;
841+
842+ #[ derive( Debug , Deserialize , Serialize , PartialEq , Eq ) ]
843+ struct A < ' a > ( u32 , Option < & ' a str > , u16 , bool ) ;
844+
845+ let a1 = A ( 42 , Some ( "A string" ) , 720 , false ) ;
846+ let serialized = crate :: to_string :: < _ , N > ( & a1) . unwrap ( ) ;
847+ let ( a2, _size) : ( A < ' _ > , usize ) = crate :: from_str ( & serialized) . unwrap ( ) ;
848+ assert_eq ! ( a1, a2) ;
849+ }
850+
825851 #[ test]
826852 fn test_serialize_bytes ( ) {
827853 use core:: fmt:: Write ;
0 commit comments