mod cjson;
use json;
use serde::de::DeserializeOwned;
use serde::ser::Serialize;
use std::fmt::Debug;
use std::io::{Read, Write};
use Result;
use error::Error;
pub trait DataInterchange: Debug + PartialEq {
type RawData: Serialize + DeserializeOwned;
fn extension() -> &'static str;
fn canonicalize(raw_data: &Self::RawData) -> Result<Vec<u8>>;
fn deserialize<T>(raw_data: &Self::RawData) -> Result<T>
where
T: DeserializeOwned;
fn serialize<T>(data: &T) -> Result<Self::RawData>
where
T: Serialize;
fn to_writer<W, T: ?Sized>(writer: W, value: &T) -> Result<()>
where
W: Write,
T: Serialize;
fn from_reader<R, T>(rdr: R) -> Result<T>
where
R: Read,
T: DeserializeOwned;
}
#[derive(Debug, PartialEq)]
pub struct JsonDataInterchange {}
impl DataInterchange for JsonDataInterchange {
type RawData = json::Value;
fn extension() -> &'static str {
"json"
}
fn canonicalize(raw_data: &Self::RawData) -> Result<Vec<u8>> {
cjson::canonicalize(raw_data).map_err(|e| Error::Opaque(e))
}
fn deserialize<T>(raw_data: &Self::RawData) -> Result<T>
where
T: DeserializeOwned,
{
Ok(json::from_value(raw_data.clone())?)
}
fn serialize<T>(data: &T) -> Result<Self::RawData>
where
T: Serialize,
{
Ok(json::to_value(data)?)
}
fn to_writer<W, T: ?Sized>(writer: W, value: &T) -> Result<()>
where
W: Write,
T: Serialize,
{
Ok(json::to_writer(writer, value)?)
}
fn from_reader<R, T>(rdr: R) -> Result<T>
where
R: Read,
T: DeserializeOwned,
{
Ok(json::from_reader(rdr)?)
}
}