diff options
Diffstat (limited to 'src/types/serde_json.rs')
-rw-r--r-- | src/types/serde_json.rs | 39 |
1 files changed, 16 insertions, 23 deletions
diff --git a/src/types/serde_json.rs b/src/types/serde_json.rs index abaecda..a9761bd 100644 --- a/src/types/serde_json.rs +++ b/src/types/serde_json.rs @@ -1,4 +1,4 @@ -//! `ToSql` and `FromSql` implementation for JSON `Value`. +//! [`ToSql`] and [`FromSql`] implementation for JSON `Value`. use serde_json::Value; @@ -7,6 +7,7 @@ use crate::Result; /// Serialize JSON `Value` to text. impl ToSql for Value { + #[inline] fn to_sql(&self) -> Result<ToSqlOutput<'_>> { Ok(ToSqlOutput::from(serde_json::to_string(self).unwrap())) } @@ -14,47 +15,39 @@ impl ToSql for Value { /// Deserialize text/blob to JSON `Value`. impl FromSql for Value { + #[inline] fn column_result(value: ValueRef<'_>) -> FromSqlResult<Self> { - match value { - ValueRef::Text(s) => serde_json::from_slice(s), - ValueRef::Blob(b) => serde_json::from_slice(b), - _ => return Err(FromSqlError::InvalidType), - } - .map_err(|err| FromSqlError::Other(Box::new(err))) + let bytes = value.as_bytes()?; + serde_json::from_slice(bytes).map_err(|err| FromSqlError::Other(Box::new(err))) } } #[cfg(test)] mod test { use crate::types::ToSql; - use crate::{Connection, NO_PARAMS}; + use crate::{Connection, Result}; - fn checked_memory_handle() -> Connection { - let db = Connection::open_in_memory().unwrap(); - db.execute_batch("CREATE TABLE foo (t TEXT, b BLOB)") - .unwrap(); - db + fn checked_memory_handle() -> Result<Connection> { + let db = Connection::open_in_memory()?; + db.execute_batch("CREATE TABLE foo (t TEXT, b BLOB)")?; + Ok(db) } #[test] - fn test_json_value() { - let db = checked_memory_handle(); + fn test_json_value() -> Result<()> { + let db = checked_memory_handle()?; let json = r#"{"foo": 13, "bar": "baz"}"#; let data: serde_json::Value = serde_json::from_str(json).unwrap(); db.execute( "INSERT INTO foo (t, b) VALUES (?, ?)", &[&data as &dyn ToSql, &json.as_bytes()], - ) - .unwrap(); + )?; - let t: serde_json::Value = db - .query_row("SELECT t FROM foo", NO_PARAMS, |r| r.get(0)) - .unwrap(); + let t: serde_json::Value = db.query_row("SELECT t FROM foo", [], |r| r.get(0))?; assert_eq!(data, t); - let b: serde_json::Value = db - .query_row("SELECT b FROM foo", NO_PARAMS, |r| r.get(0)) - .unwrap(); + let b: serde_json::Value = db.query_row("SELECT b FROM foo", [], |r| r.get(0))?; assert_eq!(data, b); + Ok(()) } } |