cdbc_sqlite/types/
json.rs1use 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}