use std::fmt;
use std::str::FromStr;
use serde::de::{self, Deserialize, Deserializer, IntoDeserializer, Visitor};
use serde::ser::{Serialize, Serializer};
use serde_json::{self, Value};
macro_attr! {
#[derive(Clone, PartialEq,
NewtypeDeref!, NewtypeDerefMut!, NewtypeDisplay!, NewtypeFrom!)]
pub struct Json(Value);
}
impl Json {
#[inline]
pub fn new(value: Value) -> Self {
Json(value)
}
#[inline]
pub fn new_string(s: String) -> Self {
Json(Value::String(s))
}
}
impl From<String> for Json {
fn from(s: String) -> Self {
Json::new_string(s)
}
}
impl<'s> From<&'s str> for Json {
fn from(s: &'s str) -> Self {
Json::new_string(s.to_owned())
}
}
impl<'de> Deserialize<'de> for Json {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de>
{
Value::deserialize(deserializer).map(Json::new)
}
}
impl FromStr for Json {
type Err = serde_json::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Value::from_str(s).map(Json::new)
}
}
impl<'de> Deserializer<'de> for Json {
type Error = de::value::Error;
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
where V: Visitor<'de>
{
self.0.deserialize_any(visitor)
.map_err(|e| de::Error::custom(format!("JSON deserialization error: {}", e)))
}
forward_to_deserialize_any! {
bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
byte_buf option unit unit_struct newtype_struct seq tuple
tuple_struct map struct enum identifier ignored_any
}
}
impl<'de> IntoDeserializer<'de> for Json {
type Deserializer = Self;
fn into_deserializer(self) -> Self {
self
}
}
impl Serialize for Json {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer
{
self.0.serialize(serializer)
}
}
impl fmt::Debug for Json {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "{:?}", self.0)
}
}