Skip to content

Commit 3e3d6f2

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

File tree

1 file changed

+34
-7
lines changed

1 file changed

+34
-7
lines changed

src/sql/ser.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use serde::{
44
Serialize,
55
ser::{self, SerializeSeq, SerializeTuple, Serializer},
66
};
7+
use serde::ser::SerializeTupleStruct;
78
use thiserror::Error;
89

910
use 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

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

Comments
 (0)