use serde::{
Deserialize,
de::{self},
ser::Serialize,
};
#[derive(Debug, Clone)]
#[must_use]
pub struct Json<T>(pub T);
impl<T> Json<T> {
pub fn into_inner(self) -> T {
self.0
}
}
impl<'de, T> Deserialize<'de> for Json<T>
where
T: Deserialize<'de>,
{
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
use std::{fmt, marker::PhantomData};
struct Visitor<T> {
phantom: PhantomData<T>,
}
impl<'de, T> de::Visitor<'de> for Visitor<T>
where
T: Deserialize<'de>,
{
type Value = Json<T>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("Json")
}
fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
where
E: de::Error,
{
let value: T = serde_json::from_slice(v).map_err(|e| {
de::Error::custom(format!(
"Cannot deserialize from json (borrowed bytes): {}",
e
))
})?;
Ok(Json(value))
}
fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
where
E: de::Error,
{
let value: T = serde_json::from_str(v).map_err(|e| {
de::Error::custom(format!(
"Cannot deserialize from json (borrowed str): {}",
e
))
})?;
Ok(Json(value))
}
}
deserializer.deserialize_any(Visitor {
phantom: PhantomData,
})
}
}
#[derive(Debug, Clone)]
#[must_use]
pub struct JsonRef<'a, T>(pub &'a T);
impl<'a, T> Serialize for JsonRef<'a, T>
where
T: Serialize,
{
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
if let Ok(bytes) = serde_json::to_vec(&self.0) {
serializer.serialize_bytes(&bytes)
} else {
serializer.serialize_unit()
}
}
}