use mime::Mime;
use std::fmt;
use std::io::{Read, Write};
pub mod none;
#[cfg(feature = "serde_json")]
pub mod json;
#[cfg(feature = "serde_xml")]
pub mod xml;
pub use serde::Serialize;
pub use serde::de::DeserializeOwned as Deserialize;
use serde::de::IntoDeserializer;
use serde::ser::SerializeMap;
pub trait Serializer: Send + Sync + 'static {
fn serialize<T: Serialize, W: Write>(&self, val: &T, write: &mut W) -> ::Result<()>;
fn content_type(&self) -> Option<Mime>;
}
pub trait Deserializer: Send + Sync + 'static {
fn deserialize<T: Deserialize, R: Read>(&self, read: &mut R) -> ::Result<T>;
}
pub struct FromStrDeserializer;
#[derive(Clone)]
pub struct PairMap<K, V> {
pairs: Vec<(K, V)>,
}
impl<K, V> PairMap<K, V> {
pub fn new() -> Self {
PairMap {
pairs: Vec::new()
}
}
pub fn insert(&mut self, key: K, val: V) {
self.pairs.push((key, val));
}
pub fn pairs(&self) -> &[(K, V)] {
&self.pairs
}
pub fn pairs_mut(&mut self) -> &mut Vec<(K, V)> {
&mut self.pairs
}
pub fn into_pairs(self) -> Vec<(K, V)> {
self.pairs
}
}
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for PairMap<K, V> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut debug = f.debug_map();
for &(ref key, ref val) in &self.pairs {
debug.entry(key, val);
}
debug.finish()
}
}
use serde::de::Error;
use std::error::Error as StdError;
use std::fmt::Display;
impl<K: Display, V: Serialize> Serialize for PairMap<K, V> {
fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error> where S: ::serde::Serializer,
S::SerializeMap: SerializeMap {
use std::fmt::Write;
let pairs = self.pairs();
let mut map_s = s.serialize_map(Some(pairs.len()))?;
let mut key_buf = String::new();
for &(ref key, ref val) in pairs {
key_buf.clear();
write!(key_buf, "{}", key).expect("Error formatting key");
map_s.serialize_entry(&key_buf, val)?;
}
map_s.end()
}
}
impl Error for ::Error {
fn custom<T: Display>(msg: T) -> Self {
let error: Box<StdError + Send + Sync> = msg.to_string().into();
::Error::Deserialize(error)
}
}
impl Deserializer for FromStrDeserializer {
fn deserialize<T: Deserialize, R: Read>(&self, read: &mut R) -> ::Result<T> {
let mut string = String::new();
let string = read.read_to_string(&mut string)?;
T::deserialize(string.into_deserializer())
}
}
#[test]
fn pair_map_is_serialize() {
use std::io;
let pair_map: PairMap<String, String> = PairMap::new();
let _ = none::NoSerializer.serialize(&pair_map, &mut io::sink());
}