use bytes::{BufMut, BytesMut};
use crate::error::{Error, Result};
use crate::types::{FromSql, Oid, ToSql};
const JSONB_VERSION: u8 = 1;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Json<T>(pub T);
impl<T: serde::Serialize> ToSql for Json<T> {
fn oid(&self) -> Oid {
Oid::JSONB
}
fn to_sql(&self, buf: &mut BytesMut) -> Result<()> {
buf.put_u8(JSONB_VERSION);
serde_json::to_writer(buf.writer(), &self.0)
.map_err(|e| Error::Encode(format!("jsonb: serialization failed: {e}")))?;
Ok(())
}
}
impl<T: serde::de::DeserializeOwned> FromSql for Json<T> {
fn oid() -> Oid {
Oid::JSONB
}
fn from_sql(buf: &[u8]) -> Result<Self> {
let data = if buf.first() == Some(&JSONB_VERSION) {
&buf[1..]
} else {
buf
};
let value = serde_json::from_slice(data)
.map_err(|e| Error::Decode(format!("jsonb: deserialization failed: {e}")))?;
Ok(Json(value))
}
}
impl ToSql for serde_json::Value {
fn oid(&self) -> Oid {
Oid::JSONB
}
fn to_sql(&self, buf: &mut BytesMut) -> Result<()> {
buf.put_u8(JSONB_VERSION);
serde_json::to_writer(buf.writer(), self)
.map_err(|e| Error::Encode(format!("jsonb: serialization failed: {e}")))?;
Ok(())
}
}
impl FromSql for serde_json::Value {
fn oid() -> Oid {
Oid::JSONB
}
fn from_sql(buf: &[u8]) -> Result<Self> {
let data = if buf.first() == Some(&JSONB_VERSION) {
&buf[1..]
} else {
buf
};
serde_json::from_slice(data)
.map_err(|e| Error::Decode(format!("jsonb: deserialization failed: {e}")))
}
}