clickhouse_arrow/native/values/
json.rs

1use serde::de::DeserializeOwned;
2use serde::{Deserialize, Serialize};
3
4use crate::{Error, FromSql, Result, ToSql, Type, Value};
5
6/// A `Vec` wrapper that is encoded as a tuple in SQL as opposed to a Vec
7#[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}