clickhouse_arrow/native/values/
json.rs1use serde::de::DeserializeOwned;
2use serde::{Deserialize, Serialize};
3
4use crate::{Error, FromSql, Result, ToSql, Type, Value};
5
6#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
8pub struct Json<T>(pub T);
9
10impl<T: Serialize> ToSql for Json<T> {
11 fn to_sql(self, _type_hint: Option<&Type>) -> Result<Value> {
12 Ok(Value::Object(
13 serde_json::to_string(&self.0)
14 .map_err(|e| Error::SerializeError(e.to_string()))?
15 .into_bytes(),
16 ))
17 }
18}
19
20impl<T: DeserializeOwned> FromSql for Json<T> {
21 fn from_sql(type_: &Type, value: Value) -> Result<Self> {
22 let raw: String = FromSql::from_sql(type_, value)?;
23
24 Ok(Json(serde_json::from_str(&raw).map_err(|e| Error::DeserializeError(e.to_string()))?))
25 }
26}