Skip to content

Commit

Permalink
Merge pull request #120 from v3xro/fix/bind-optional
Browse files Browse the repository at this point in the history
fix(bind): allow serialization of Some(_) and None values (as the inner value and NULL respectively)
  • Loading branch information
loyd authored Aug 7, 2024
2 parents 0e6260b + f515d3b commit 47e49b4
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 11 deletions.
21 changes: 14 additions & 7 deletions src/sql/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,20 +184,27 @@ mod tests {
);
}

#[test]
fn option_as_null() {
let mut sql = SqlBuilder::new("SELECT 1 FROM test WHERE a = ?");
sql.bind_arg(None::<u32>);
assert_eq!(sql.finish().unwrap(), r"SELECT 1 FROM test WHERE a = NULL");
}

#[test]
fn option_as_value() {
let mut sql = SqlBuilder::new("SELECT 1 FROM test WHERE a = ?");
sql.bind_arg(Some(1u32));
assert_eq!(sql.finish().unwrap(), r"SELECT 1 FROM test WHERE a = 1");
}

#[test]
fn failures() {
let mut sql = SqlBuilder::new("SELECT 1");
sql.bind_arg(42);
let err = sql.finish().unwrap_err();
assert!(err.to_string().contains("all arguments are already bound"));

let mut sql = SqlBuilder::new("SELECT ?");
sql.bind_arg(None::<u32>);
let err = sql.finish().unwrap_err();
assert!(err
.to_string()
.contains("invalid argument: serialize_none is unsupported"));

let mut sql = SqlBuilder::new("SELECT ?fields");
sql.bind_fields::<Unnamed>();
let err = sql.finish().unwrap_err();
Expand Down
18 changes: 14 additions & 4 deletions src/sql/ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ impl<'a, W: Write> Serializer for SqlSerializer<'a, W> {
unsupported!(
serialize_map(Option<usize>) -> Result<Impossible>,
serialize_bytes(&[u8]),
serialize_none,
serialize_unit,
serialize_unit_struct(&'static str),
);
Expand Down Expand Up @@ -141,7 +140,13 @@ impl<'a, W: Write> Serializer for SqlSerializer<'a, W> {

#[inline]
fn serialize_some<T: Serialize + ?Sized>(self, _value: &T) -> Result {
Err(SqlSerializerError::Unsupported("serialize_some"))
_value.serialize(self)
}

#[inline]
fn serialize_none(self) -> std::result::Result<Self::Ok, Self::Error> {
self.writer.write_str("NULL")?;
Ok(())
}

#[inline]
Expand Down Expand Up @@ -336,12 +341,17 @@ mod tests {
assert_eq!(check((42, 43)), "(42,43)");
}

#[test]
fn it_writes_options() {
assert_eq!(check(None::<i32>), "NULL");
assert_eq!(check(Some(32)), "32");
assert_eq!(check(Some(vec![42, 43])), "[42,43]");
}

#[test]
fn it_fails_on_unsupported() {
let mut out = String::new();
assert!(write_arg(&mut out, &std::collections::HashMap::<u32, u32>::new()).is_err());
assert!(write_arg(&mut out, &None::<u32>).is_err());
assert!(write_arg(&mut out, &Some(42)).is_err());
assert!(write_arg(&mut out, &()).is_err());

#[derive(Serialize)]
Expand Down

0 comments on commit 47e49b4

Please sign in to comment.