use crate::{Error, Result, Row};
use serde::{de::DeserializeOwned, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct Json<T>(pub T);
impl<T> Json<T> {
pub fn into_inner(self) -> T {
self.0
}
}
impl<T> From<T> for Json<T> {
fn from(v: T) -> Self {
Json(v)
}
}
impl<T> core::ops::Deref for Json<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
impl<T> core::ops::DerefMut for Json<T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.0
}
}
impl<T> crate::SqlType for Json<T> {
const COLUMN_TYPE: crate::ColumnType = crate::ColumnType::Text;
}
impl<T: Serialize> crate::ToColumn for Json<T> {
fn to_value(&self) -> sea_query::Value {
let s = serde_json::to_string(&self.0).unwrap_or_else(|_| "null".to_string());
sea_query::Value::String(Some(Box::new(s)))
}
}
impl<T: DeserializeOwned> crate::FromColumn for Json<T> {
fn from_column(row: &dyn Row, col: &str) -> Result<Self> {
let s =
row.get_string(col)?.ok_or_else(|| Error::msg(format!("column `{col}` was NULL")))?;
serde_json::from_str(&s)
.map(Json)
.map_err(|e| Error::msg(format!("column `{col}`: invalid JSON: {e}")))
}
}