use serde::{Deserialize, Serialize, de::DeserializeOwned};
use crate::{
Decode, DecodeError, Encode,
encode::Encoded,
postgres::{Oid, PgType},
row::Column,
};
pub struct Json<T>(T);
impl<T> PgType for Json<T> {
const OID: Oid = 3802;
}
impl<T> Decode for Json<T>
where
T: DeserializeOwned,
{
fn decode(column: Column) -> Result<Self, DecodeError> {
if column.oid() != Self::OID {
return Err(DecodeError::OidMissmatch);
}
serde_json::from_slice(&column.into_value()).map_err(Into::into)
}
}
impl<T: Serialize> Encode<'static> for Json<T> {
fn encode(self) -> Encoded<'static> {
Encoded::owned(serde_json::to_vec(&self).unwrap(), Self::OID)
}
}
impl<T: Serialize> Serialize for Json<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.serialize(serializer)
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Json<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Ok(Self(T::deserialize(deserializer)?))
}
}