diff --git a/serde_macros/src/lib.rs b/serde_macros/src/lib.rs index fa141540..db7fd60d 100644 --- a/serde_macros/src/lib.rs +++ b/serde_macros/src/lib.rs @@ -73,8 +73,22 @@ fn expand_deriving_serializable(cx: &mut ExtCtxt, span: sp, attributes: vec!(), path: Path::new(vec!("serde", "ser", "Serializable")), + /* + path: Path::new_(vec!("serde", "ser", "Serializable"), None, + vec!(box Literal(Path::new_local("__S")), + box Literal(Path::new_local("__E"))), true), + */ additional_bounds: Vec::new(), generics: LifetimeBounds::empty(), + /* + generics: LifetimeBounds { + lifetimes: Vec::new(), + bounds: vec!(("__S", None, vec!(Path::new_( + vec!("serde", "ser", "Serializer"), None, + vec!(box Literal(Path::new_local("__E"))), true))), + ("__E", None, vec!())) + }, + */ methods: vec!( MethodDef { name: "serialize", @@ -204,36 +218,21 @@ pub fn expand_deriving_deserializable(cx: &mut ExtCtxt, let trait_def = TraitDef { span: span, attributes: Vec::new(), - path: Path::new(vec!("serde", "de", "Deserializable")), + path: Path::new_(vec!("serde", "de", "Deserializable"), None, + vec!(box Literal(Path::new_local("__D")), + box Literal(Path::new_local("__E"))), true), additional_bounds: Vec::new(), - generics: LifetimeBounds::empty(), + generics: LifetimeBounds { + lifetimes: Vec::new(), + bounds: vec!(("__D", None, vec!(Path::new_( + vec!("serde", "de", "Deserializer"), None, + vec!(box Literal(Path::new_local("__E"))), true))), + ("__E", None, vec!())) + }, methods: vec!( MethodDef { name: "deserialize_token", - generics: LifetimeBounds { - lifetimes: Vec::new(), - bounds: vec!( - ( - "__D", - None, - vec!( - Path::new_( - vec!("serde", "de", "Deserializer"), - None, - vec!( - box Literal(Path::new_local("__E")) - ), - true - ) - ) - ), - ( - "__E", - None, - vec!(), - ), - ) - }, + generics: LifetimeBounds::empty(), explicit_self: None, args: vec!( Ptr( diff --git a/src/bench_enum.rs b/src/bench_enum.rs index 1880ab14..9a98e2ec 100644 --- a/src/bench_enum.rs +++ b/src/bench_enum.rs @@ -252,7 +252,7 @@ mod deserializer { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } diff --git a/src/bench_log.rs b/src/bench_log.rs index 0b7ba6ae..bb49be18 100644 --- a/src/bench_log.rs +++ b/src/bench_log.rs @@ -45,12 +45,9 @@ impl ser::Serializable for HttpProtocol { } } -impl de::Deserializable for HttpProtocol { +impl, E> de::Deserializable for HttpProtocol { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { d.expect_from_primitive(token) } } @@ -80,12 +77,9 @@ impl ser::Serializable for HttpMethod { } } -impl de::Deserializable for HttpMethod { +impl, E> de::Deserializable for HttpMethod { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { d.expect_from_primitive(token) } } @@ -108,12 +102,9 @@ impl ser::Serializable for CacheStatus { } } -impl de::Deserializable for CacheStatus { +impl, E> de::Deserializable for CacheStatus { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { d.expect_from_primitive(token) } } @@ -145,12 +136,9 @@ impl ser::Serializable for OriginProtocol { } } -impl de::Deserializable for OriginProtocol { +impl, E> de::Deserializable for OriginProtocol { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { d.expect_from_primitive(token) } } @@ -174,12 +162,9 @@ impl ser::Serializable for ZonePlan { } } -impl de::Deserializable for ZonePlan { +impl, E> de::Deserializable for ZonePlan { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { d.expect_from_primitive(token) } } @@ -454,12 +439,9 @@ impl ser::Serializable for Country { } } -impl de::Deserializable for Country { +impl, E> de::Deserializable for Country { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { d.expect_from_primitive(token) } } diff --git a/src/bench_map.rs b/src/bench_map.rs index 0ef94bbc..c5a3abae 100644 --- a/src/bench_map.rs +++ b/src/bench_map.rs @@ -248,7 +248,7 @@ mod deserializer { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } @@ -298,9 +298,9 @@ fn bench_decoder_100(b: &mut Bencher) { } fn run_deserializer< - E: Show, D: Deserializer, - T: Clone + PartialEq + Show + Deserializable + E: Show, + T: Clone + PartialEq + Show + Deserializable >(mut d: D, value: T) { let v: T = Deserializable::deserialize(&mut d).unwrap(); diff --git a/src/bench_struct.rs b/src/bench_struct.rs index 0c5f3144..c1b098d9 100644 --- a/src/bench_struct.rs +++ b/src/bench_struct.rs @@ -372,7 +372,7 @@ mod deserializer { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } diff --git a/src/bench_vec.rs b/src/bench_vec.rs index 83477ef0..b526cf6e 100644 --- a/src/bench_vec.rs +++ b/src/bench_vec.rs @@ -316,7 +316,7 @@ mod deserializer { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } @@ -388,7 +388,7 @@ mod deserializer { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } @@ -398,8 +398,8 @@ mod deserializer { ////////////////////////////////////////////////////////////////////////////// fn run_decoder< - E: Show, D: Decoder, + E: Show, T: Clone + PartialEq + Show + Decodable >(mut d: D, value: T) { let v: T = Decodable::decode(&mut d).unwrap(); @@ -408,9 +408,9 @@ fn run_decoder< } fn run_deserializer< - E: Show, D: Deserializer, - T: Clone + PartialEq + Show + Deserializable + E: Show, + T: Clone + PartialEq + Show + Deserializable >(mut d: D, value: T) { let v: T = Deserializable::deserialize(&mut d).unwrap(); diff --git a/src/de.rs b/src/de.rs index fd6ffa0c..ee5286f0 100644 --- a/src/de.rs +++ b/src/de.rs @@ -192,7 +192,7 @@ pub trait Deserializer: Iterator> { /// Called when a `Deserializable` structure did not deserialize a field /// named `field`. fn missing_field< - T: Deserializable + T: Deserializable >(&mut self, field: &'static str) -> Result; /// Called when a deserializable has decided to not consume this token. @@ -304,7 +304,7 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_option< - T: Deserializable + T: Deserializable >(&mut self, token: Token) -> Result, E> { match token { Option(false) => Ok(None), @@ -327,7 +327,7 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_tuple_elt< - T: Deserializable + T: Deserializable >(&mut self) -> Result { Deserializable::deserialize(self) } @@ -356,7 +356,7 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_struct_field< - T: Deserializable + T: Deserializable >(&mut self, name: &str) -> Result { match try!(self.expect_token()) { Str(n) => { @@ -404,7 +404,7 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_enum_elt< - T: Deserializable + T: Deserializable >(&mut self) -> Result { Deserializable::deserialize(self) } @@ -428,7 +428,7 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_seq_elt_or_end< - T: Deserializable + T: Deserializable >(&mut self) -> Result, E> { match try!(self.expect_token()) { End => Ok(None), @@ -442,7 +442,7 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_seq< 'a, - T: Deserializable, + T: Deserializable, C: FromIterator >(&'a mut self, token: Token) -> Result { let len = try!(self.expect_seq_start(token)); @@ -471,8 +471,8 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_map_elt_or_end< - K: Deserializable, - V: Deserializable + K: Deserializable, + V: Deserializable >(&mut self) -> Result, E> { match try!(self.expect_token()) { End => Ok(None), @@ -487,8 +487,8 @@ pub trait Deserializer: Iterator> { #[inline] fn expect_map< 'a, - K: Deserializable, - V: Deserializable, + K: Deserializable, + V: Deserializable, C: FromIterator<(K, V)> >(&'a mut self, token: Token) -> Result { let len = try!(self.expect_map_start(token)); @@ -518,9 +518,9 @@ struct SeqDeserializer<'a, D, E> { impl< 'a, - T: Deserializable, D: Deserializer, - E + E, + T: Deserializable > Iterator for SeqDeserializer<'a, D, E> { #[inline] fn next(&mut self) -> Option { @@ -549,10 +549,10 @@ struct MapDeserializer<'a, D, E> { impl< 'a, - K: Deserializable, - V: Deserializable, D: Deserializer, - E + E, + K: Deserializable, + V: Deserializable > Iterator<(K, V)> for MapDeserializer<'a, D, E> { #[inline] fn next(&mut self) -> Option<(K, V)> { @@ -573,32 +573,23 @@ impl< ////////////////////////////////////////////////////////////////////////////// -pub trait Deserializable { +pub trait Deserializable, E> { #[inline] - fn deserialize< - D: Deserializer, - E - >(d: &mut D) -> Result { + fn deserialize(d: &mut D) -> Result { let token = try!(d.expect_token()); Deserializable::deserialize_token(d, token) } - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result; + fn deserialize_token(d: &mut D, token: Token) -> Result; } ////////////////////////////////////////////////////////////////////////////// macro_rules! impl_deserializable { ($ty:ty, $method:ident) => { - impl Deserializable for $ty { + impl, E> Deserializable for $ty { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result<$ty, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result<$ty, E> { d.$method(token) } } @@ -624,66 +615,72 @@ impl_deserializable!(String, expect_string) ////////////////////////////////////////////////////////////////////////////// -impl Deserializable for Box { +impl< + D: Deserializer, + E, + T: Deserializable +> Deserializable for Box { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(box try!(Deserializable::deserialize_token(d, token))) } } -impl Deserializable for Gc { +impl< + D: Deserializer, + E, + T: Deserializable + 'static +> Deserializable for Gc { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(box (GC) try!(Deserializable::deserialize_token(d, token))) } } -impl Deserializable for Rc { +impl< + D: Deserializer, + E, + T: Deserializable +> Deserializable for Rc { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(Rc::new(try!(Deserializable::deserialize_token(d, token)))) } } -impl Deserializable for Arc { +impl< + D: Deserializer, + E, + T: Deserializable + Send + Sync +> Deserializable for Arc { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { Ok(Arc::new(try!(Deserializable::deserialize_token(d, token)))) } } ////////////////////////////////////////////////////////////////////////////// -impl Deserializable for Option { +impl< + D: Deserializer, + E, + T: Deserializable +> Deserializable for Option { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_option(token) } } ////////////////////////////////////////////////////////////////////////////// -impl Deserializable for Vec { +impl< + D: Deserializer, + E, + T: Deserializable +> Deserializable for Vec { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_seq(token) } } @@ -691,27 +688,25 @@ impl Deserializable for Vec { ////////////////////////////////////////////////////////////////////////////// impl< - K: Deserializable + Eq + Hash, - V: Deserializable -> Deserializable for HashMap { + D: Deserializer, + E, + K: Deserializable + Eq + Hash, + V: Deserializable +> Deserializable for HashMap { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_map(token) } } impl< - K: Deserializable + Ord, - V: Deserializable -> Deserializable for TreeMap { + D: Deserializer, + E, + K: Deserializable + Ord, + V: Deserializable +> Deserializable for TreeMap { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_map(token) } } @@ -719,25 +714,23 @@ impl< ////////////////////////////////////////////////////////////////////////////// impl< - T: Deserializable + Eq + Hash -> Deserializable for HashSet { + D: Deserializer, + E, + T: Deserializable + Eq + Hash +> Deserializable for HashSet { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_seq(token) } } impl< - T: Deserializable + Ord -> Deserializable for TreeSet { + D: Deserializer, + E, + T: Deserializable + Ord +> Deserializable for TreeSet { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result, E> { + fn deserialize_token(d: &mut D, token: Token) -> Result, E> { d.expect_seq(token) } } @@ -750,26 +743,25 @@ macro_rules! peel { macro_rules! impl_deserialize_tuple { () => { - impl Deserializable for () { + impl< + D: Deserializer, + E + > Deserializable for () { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result<(), E> { + fn deserialize_token(d: &mut D, token: Token) -> Result<(), E> { d.expect_null(token) } } }; ( $($name:ident,)+ ) => { impl< - $($name: Deserializable),* - > Deserializable for ($($name,)*) { + D: Deserializer, + E, + $($name: Deserializable),* + > Deserializable for ($($name,)*) { #[inline] #[allow(uppercase_variables)] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result<($($name,)*), E> { + fn deserialize_token(d: &mut D, token: Token) -> Result<($($name,)*), E> { try!(d.expect_tuple_start(token)); let result = ($({ @@ -794,12 +786,9 @@ impl_deserialize_tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, } /// recursive structures. pub struct IgnoreTokens; -impl Deserializable for IgnoreTokens { +impl, E> Deserializable for IgnoreTokens { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result { + fn deserialize_token(d: &mut D, token: Token) -> Result { match token { Option(true) => { Deserializable::deserialize(d) @@ -984,12 +973,9 @@ impl GatherTokens { } } -impl Deserializable for GatherTokens { +impl, E> Deserializable for GatherTokens { #[inline] - fn deserialize_token< - D: Deserializer, - E - >(d: &mut D, token: Token) -> Result { + fn deserialize_token(d: &mut D, token: Token) -> Result { let mut tokens = GatherTokens { tokens: vec!(), }; @@ -1050,11 +1036,12 @@ mod tests { c: TreeMap>, } - impl Deserializable for Inner { + impl< + D: Deserializer, + E + > Deserializable for Inner { #[inline] - fn deserialize_token< - D: Deserializer, E - >(d: &mut D, token: Token) -> Result { + fn deserialize_token(d: &mut D, token: Token) -> Result { try!(d.expect_struct_start(token, "Inner")); let a = try!(d.expect_struct_field("a")); let b = try!(d.expect_struct_field("b")); @@ -1071,11 +1058,9 @@ mod tests { inner: Vec, } - impl Deserializable for Outer { + impl, E> Deserializable for Outer { #[inline] - fn deserialize_token< - D: Deserializer, E - >(d: &mut D, token: Token) -> Result { + fn deserialize_token(d: &mut D, token: Token) -> Result { try!(d.expect_struct_start(token, "Outer")); let inner = try!(d.expect_struct_field("inner")); try!(d.expect_struct_end()); @@ -1091,11 +1076,9 @@ mod tests { Frog(String, int) } - impl Deserializable for Animal { + impl, E> Deserializable for Animal { #[inline] - fn deserialize_token< - D: Deserializer, E - >(d: &mut D, token: Token) -> Result { + fn deserialize_token(d: &mut D, token: Token) -> Result { match try!(d.expect_enum_start(token, "Animal", ["Dog", "Frog"])) { 0 => { try!(d.expect_enum_end()); @@ -1165,7 +1148,7 @@ mod tests { #[inline] fn missing_field< - T: Deserializable + T: Deserializable, Error> >(&mut self, _field: &'static str) -> Result { Err(SyntaxError) } diff --git a/src/json/mod.rs b/src/json/mod.rs index 077fc1b7..7e2a2415 100644 --- a/src/json/mod.rs +++ b/src/json/mod.rs @@ -521,12 +521,9 @@ impl ser::Serializable for Json { } } -impl de::Deserializable for Json { +impl, E> de::Deserializable for Json { #[inline] - fn deserialize_token< - D: de::Deserializer, - E - >(d: &mut D, token: de::Token) -> Result { + fn deserialize_token(d: &mut D, token: de::Token) -> Result { match token { de::Null => Ok(Null), de::Bool(x) => Ok(Boolean(x)), @@ -665,7 +662,7 @@ impl de::Deserializer for JsonDeserializer { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable >(&mut self, _field: &'static str) -> Result { // JSON can represent `null` values as a missing value, so this isn't // necessarily an error. @@ -675,7 +672,7 @@ impl de::Deserializer for JsonDeserializer { // Special case treating options as a nullable value. #[inline] fn expect_option< - U: de::Deserializable + U: de::Deserializable >(&mut self, token: de::Token) -> Result, ParserError> { match token { de::Null => Ok(None), @@ -1592,8 +1589,8 @@ impl Stack { /// A streaming JSON parser implemented as an iterator of JsonEvent, consuming /// an iterator of char. -pub struct Parser { - rdr: T, +pub struct Parser { + rdr: Iter, ch: Option, line: uint, col: uint, @@ -1601,7 +1598,7 @@ pub struct Parser { state_stack: Vec, } -impl> Iterator> for Parser { +impl> Iterator> for Parser { #[inline] fn next(&mut self) -> Option> { let state = match self.state_stack.pop() { @@ -1632,9 +1629,9 @@ impl> Iterator> for Parser { } } -impl> Parser { +impl> Parser { /// Creates the JSON parser. - pub fn new(rdr: T) -> Parser { + pub fn new(rdr: Iter) -> Parser { let mut p = Parser { rdr: rdr, ch: Some('\x00'), @@ -2027,7 +2024,7 @@ impl> Parser { } } -impl> de::Deserializer for Parser { +impl> de::Deserializer for Parser { fn end_of_stream_error(&mut self) -> ParserError { SyntaxError(EOFWhileParsingValue, self.line, self.col) } @@ -2046,7 +2043,7 @@ impl> de::Deserializer for Parser { #[inline] fn missing_field< - T: de::Deserializable + T: de::Deserializable, ParserError> >(&mut self, _field: &'static str) -> Result { // JSON can represent `null` values as a missing value, so this isn't // necessarily an error. @@ -2056,7 +2053,7 @@ impl> de::Deserializer for Parser { // Special case treating options as a nullable value. #[inline] fn expect_option< - U: de::Deserializable + U: de::Deserializable, ParserError> >(&mut self, token: de::Token) -> Result, ParserError> { match token { de::Null => Ok(None), @@ -2113,7 +2110,7 @@ impl> de::Deserializer for Parser { /// Decodes a json value from an `Iterator`. pub fn from_iter< Iter: Iterator, - T: de::Deserializable + T: de::Deserializable, ParserError> >(iter: Iter) -> Result { let mut parser = Parser::new(iter); let value = try!(de::Deserializable::deserialize(&mut parser)); @@ -2128,14 +2125,15 @@ pub fn from_iter< /// Decodes a json value from a string pub fn from_str< - T: de::Deserializable ->(s: &str) -> Result { + 'a, + T: de::Deserializable>, ParserError> +>(s: &'a str) -> Result { from_iter(s.chars()) } /// Decodes a json value from a `Json`. pub fn from_json< - T: de::Deserializable + T: de::Deserializable >(json: Json) -> Result { let mut d = JsonDeserializer::new(json); de::Deserializable::deserialize(&mut d) @@ -2304,11 +2302,12 @@ impl ToJson for Option { #[cfg(test)] mod tests { use std::fmt::Show; + use std::str; use std::collections::TreeMap; use super::{Json, Null, Boolean, Floating, String, List, Object}; - use super::{ParserError, from_iter, from_str}; - use super::{from_json, ToJson}; + use super::{Parser, ParserError, from_iter, from_str}; + use super::{JsonDeserializer, ToJson, from_json}; use super::{ EOFWhileParsingList, EOFWhileParsingObject, @@ -2751,8 +2750,9 @@ mod tests { // FIXME (#5527): these could be merged once UFCS is finished. fn test_parse_err< - T: Show + de::Deserializable - >(errors: &[(&str, ParserError)]) { + 'a, + T: Show + de::Deserializable>, ParserError> + >(errors: &[(&'a str, ParserError)]) { for &(s, ref err) in errors.iter() { let v: Result = from_iter(s.chars()); assert_eq!(v.unwrap_err(), *err); @@ -2760,8 +2760,9 @@ mod tests { } fn test_parse_ok< - T: PartialEq + Show + ToJson + de::Deserializable - >(errors: &[(&str, T)]) { + 'a, + T: PartialEq + Show + ToJson + de::Deserializable>, ParserError> + >(errors: &[(&'a str, T)]) { for &(s, ref value) in errors.iter() { let v: T = from_iter(s.chars()).unwrap(); assert_eq!(v, *value); @@ -2772,7 +2773,7 @@ mod tests { } fn test_json_deserialize_ok< - T: PartialEq + Show + ToJson + de::Deserializable + T: PartialEq + Show + ToJson + de::Deserializable >(errors: &[T]) { for value in errors.iter() { let v: T = from_json(value.to_json()).unwrap();