cdbc_sqlite/types/
json.rs

1use serde::{Deserialize, Serialize};
2
3use cdbc::decode::Decode;
4use cdbc::encode::{Encode, IsNull};
5use cdbc::error::BoxDynError;
6use crate::{
7    type_info::DataType, Sqlite, SqliteArgumentValue, SqliteTypeInfo, SqliteValueRef,
8};
9use cdbc::types::{Json, Type};
10
11impl<T> Type<Sqlite> for Json<T> {
12    fn type_info() -> SqliteTypeInfo {
13        SqliteTypeInfo(DataType::Text)
14    }
15
16    fn compatible(ty: &SqliteTypeInfo) -> bool {
17        <&str as Type<Sqlite>>::compatible(ty)
18    }
19}
20
21impl<T> Encode<'_, Sqlite> for Json<T>
22where
23    T: Serialize,
24{
25    fn encode_by_ref(&self, buf: &mut Vec<SqliteArgumentValue<'_>>) -> IsNull {
26        let json_string_value =
27            serde_json::to_string(&self.0).expect("serde_json failed to convert to string");
28
29        Encode::<Sqlite>::encode(json_string_value, buf)
30    }
31}
32
33impl<'r, T> Decode<'r, Sqlite> for Json<T>
34where
35    T: 'r + Deserialize<'r>,
36{
37    fn decode(value: SqliteValueRef<'r>) -> Result<Self, BoxDynError> {
38        let string_value = <&str as Decode<Sqlite>>::decode(value)?;
39
40        serde_json::from_str(&string_value)
41            .map(Json)
42            .map_err(Into::into)
43    }
44}