Skip to content

Commit 204210e

Browse files
feat(ser): tuple structs support for sql serializer
1 parent 54216d6 commit 204210e

File tree

1 file changed

+34
-8
lines changed

1 file changed

+34
-8
lines changed

src/sql/ser.rs

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::fmt::{self, Write};
22

33
use serde::{
44
Serialize,
5-
ser::{self, SerializeSeq, SerializeTuple, Serializer},
5+
ser::{self, SerializeSeq, SerializeTuple, SerializeTupleStruct, Serializer},
66
};
77
use 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

291314
struct 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

Comments
 (0)