diff --git a/Cargo.toml b/Cargo.toml index 3b8bdb3..02829f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,11 +19,11 @@ version = "0.3.*" optional = true [dependencies.serde] -version = "0.8.*" +version = "0.9.*" optional = true [dev-dependencies] -serde_derive = "0.8.*" +serde_derive = "0.9.*" [features] default = ["rustc-serialize", "serde"] diff --git a/src/refbox.rs b/src/refbox.rs index fb91124..addfa48 100644 --- a/src/refbox.rs +++ b/src/refbox.rs @@ -160,7 +160,7 @@ impl Decodable for RefBox<'static, T> { impl<'a, T> serde::Serialize for RefBox<'a, T> where T: serde::Serialize, { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { serde::Serialize::serialize(&self.inner, serializer) @@ -169,7 +169,7 @@ impl<'a, T> serde::Serialize for RefBox<'a, T> #[cfg(feature = "serde")] impl<'a, T: serde::Deserialize> serde::Deserialize for RefBox<'a, T> { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::Deserializer { let inner = try!(serde::Deserialize::deserialize(deserializer)); @@ -256,7 +256,7 @@ impl Decodable for StrBox<'static> { #[cfg(feature = "serde")] impl<'a> serde::Serialize for StrBox<'a> { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { serde::Serialize::serialize(&self.inner, serializer) @@ -265,7 +265,7 @@ impl<'a> serde::Serialize for StrBox<'a> { #[cfg(feature = "serde")] impl serde::Deserialize for StrBox<'static> { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::Deserializer { let inner = try!(serde::Deserialize::deserialize(deserializer)); @@ -349,7 +349,7 @@ impl Decodable for SliceBox<'static, T> { impl<'a, T> serde::Serialize for SliceBox<'a, T> where T: serde::Serialize, { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { serde::Serialize::serialize(&self.inner, serializer) @@ -358,7 +358,7 @@ impl<'a, T> serde::Serialize for SliceBox<'a, T> #[cfg(feature = "serde")] impl<'a, T: serde::Deserialize> serde::Deserialize for SliceBox<'a, T> { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::Deserializer { let inner = try!(serde::Deserialize::deserialize(deserializer)); @@ -381,7 +381,7 @@ impl<'a, A: ?Sized, B> serde::Serialize for RefBoxInner<'a, A, B> where A: serde::Serialize, B: serde::Serialize, { - fn serialize(&self, serializer: &mut S) -> Result<(), S::Error> + fn serialize(&self, serializer: S) -> Result where S: serde::Serializer { match self { @@ -403,7 +403,7 @@ impl Decodable for RefBoxInner<'static, A, B> { impl<'a, A: ?Sized, B> serde::Deserialize for RefBoxInner<'a, A, B> where B: serde::Deserialize, { - fn deserialize(deserializer: &mut D) -> Result + fn deserialize(deserializer: D) -> Result where D: serde::Deserializer { let deserialized = try!(serde::Deserialize::deserialize(deserializer)); diff --git a/src/serde/reader.rs b/src/serde/reader.rs index 00ea18c..1578a82 100644 --- a/src/serde/reader.rs +++ b/src/serde/reader.rs @@ -5,10 +5,9 @@ use std::fmt; use std::convert::From; use byteorder::{BigEndian, ReadBytesExt}; -use num_traits; use serde_crate as serde; use serde_crate::de::value::ValueDeserializer; - +use serde_crate::de::Error as DeError; use ::SizeLimit; #[derive(Eq, PartialEq, Clone, Debug)] @@ -45,7 +44,7 @@ pub enum DeserializeError { /// If decoding a message takes more than the provided size limit, this /// error is returned. SizeLimit, - Serde(serde::de::value::Error) + Custom(String) } impl Error for DeserializeError { @@ -54,7 +53,7 @@ impl Error for DeserializeError { DeserializeError::IoError(ref err) => Error::description(err), DeserializeError::InvalidEncoding(ref ib) => ib.desc, DeserializeError::SizeLimit => "the size limit for decoding has been reached", - DeserializeError::Serde(ref s) => s.description(), + DeserializeError::Custom(ref msg) => msg, } } @@ -64,7 +63,7 @@ impl Error for DeserializeError { DeserializeError::IoError(ref err) => err.cause(), DeserializeError::InvalidEncoding(_) => None, DeserializeError::SizeLimit => None, - DeserializeError::Serde(ref s) => s.cause(), + DeserializeError::Custom(_) => None, } } } @@ -75,12 +74,6 @@ impl From for DeserializeError { } } -impl From for DeserializeError { - fn from(err: serde::de::value::Error) -> DeserializeError { - DeserializeError::Serde(err) - } -} - impl fmt::Display for DeserializeError { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { match *self { @@ -90,19 +83,15 @@ impl fmt::Display for DeserializeError { write!(fmt, "InvalidEncoding: {}", ib), DeserializeError::SizeLimit => write!(fmt, "SizeLimit"), - DeserializeError::Serde(ref s) => + DeserializeError::Custom(ref s) => s.fmt(fmt), } } } impl serde::de::Error for DeserializeError { - fn custom>(desc: T) -> DeserializeError { - DeserializeError::Serde(serde::de::value::Error::Custom(desc.into())) - } - - fn end_of_stream() -> DeserializeError { - DeserializeError::Serde(serde::de::value::Error::EndOfStream) + fn custom(desc: T) -> DeserializeError { + DeserializeError::Custom(desc.to_string()) } } @@ -119,14 +108,14 @@ pub type DeserializeResult = Result; /// serde::Deserialize::deserialize(&mut deserializer); /// let bytes_read = d.bytes_read(); /// ``` -pub struct Deserializer<'a, R: 'a> { - reader: &'a mut R, +pub struct Deserializer { + reader: R, size_limit: SizeLimit, read: u64 } -impl<'a, R: Read> Deserializer<'a, R> { - pub fn new(r: &'a mut R, size_limit: SizeLimit) -> Deserializer<'a, R> { +impl Deserializer { + pub fn new(r: R, size_limit: SizeLimit) -> Deserializer { Deserializer { reader: r, size_limit: size_limit, @@ -154,7 +143,7 @@ impl<'a, R: Read> Deserializer<'a, R> { } fn read_string(&mut self) -> DeserializeResult { - let len = try!(serde::Deserialize::deserialize(self)); + let len = try!(serde::Deserialize::deserialize(&mut *self)); try!(self.read_bytes(len)); let mut buffer = Vec::new(); @@ -171,7 +160,7 @@ impl<'a, R: Read> Deserializer<'a, R> { macro_rules! impl_nums { ($ty:ty, $dser_method:ident, $visitor_method:ident, $reader_method:ident) => { #[inline] - fn $dser_method(&mut self, mut visitor: V) -> DeserializeResult + fn $dser_method(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { try!(self.read_type::<$ty>()); @@ -182,18 +171,18 @@ macro_rules! impl_nums { } -impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { +impl<'a, R: Read> serde::Deserializer for &'a mut Deserializer { type Error = DeserializeError; #[inline] - fn deserialize(&mut self, _visitor: V) -> DeserializeResult + fn deserialize(self, _visitor: V) -> DeserializeResult where V: serde::de::Visitor, { let message = "bincode does not support Deserializer::deserialize"; - Err(DeserializeError::Serde(serde::de::value::Error::Custom(message.into()))) + Err(DeserializeError::custom(message)) } - fn deserialize_bool(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_bool(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { let value: u8 = try!(serde::Deserialize::deserialize(self)); @@ -220,7 +209,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { #[inline] - fn deserialize_u8(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_u8(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { try!(self.read_type::()); @@ -228,44 +217,20 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { } #[inline] - fn deserialize_usize(&mut self, mut visitor: V) -> DeserializeResult - where V: serde::de::Visitor, - { - try!(self.read_type::()); - let value = try!(self.reader.read_u64::()); - match num_traits::cast(value) { - Some(value) => visitor.visit_usize(value), - None => Err(DeserializeError::Serde(serde::de::value::Error::Custom("expected usize".into()))) - } - } - - #[inline] - fn deserialize_i8(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_i8(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { try!(self.read_type::()); visitor.visit_i8(try!(self.reader.read_i8())) } - #[inline] - fn deserialize_isize(&mut self, mut visitor: V) -> DeserializeResult - where V: serde::de::Visitor, - { - try!(self.read_type::()); - let value = try!(self.reader.read_i64::()); - match num_traits::cast(value) { - Some(value) => visitor.visit_isize(value), - None => Err(DeserializeError::Serde(serde::de::value::Error::Custom("expected isize".into()))), - } - } - - fn deserialize_unit(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_unit(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { visitor.visit_unit() } - fn deserialize_char(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_char(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { use std::str; @@ -303,59 +268,74 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { visitor.visit_char(res) } - fn deserialize_str(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_str(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { visitor.visit_str(&try!(self.read_string())) } - fn deserialize_string(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_string(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { visitor.visit_string(try!(self.read_string())) } - fn deserialize_bytes(&mut self, visitor: V) -> DeserializeResult + fn deserialize_bytes(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { self.deserialize_seq(visitor) } - fn deserialize_enum(&mut self, - _enum: &'static str, - _variants: &'static [&'static str], - mut visitor: V) -> Result - where V: serde::de::EnumVisitor, - { - visitor.visit(self) - } - - fn deserialize_tuple(&mut self, - _len: usize, - mut visitor: V) -> DeserializeResult + fn deserialize_byte_buf(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { - struct TupleVisitor<'a, 'b: 'a, R: Read + 'b>(&'a mut Deserializer<'b, R>); + self.deserialize_seq(visitor) + } - impl<'a, 'b: 'a, R: Read + 'b> serde::de::SeqVisitor for TupleVisitor<'a, 'b, R> { + fn deserialize_enum(self, + _enum: &'static str, + _variants: &'static [&'static str], + visitor: V) -> Result + where V: serde::de::Visitor, + { + impl<'a, R: Read + 'a> serde::de::EnumVisitor for &'a mut Deserializer { + type Error = DeserializeError; + type Variant = Self; + + fn visit_variant_seed(self, seed: V) -> DeserializeResult<(V::Value, Self::Variant)> + where V: serde::de::DeserializeSeed, + { + let idx: u32 = try!(serde::de::Deserialize::deserialize(&mut *self)); + let val: Result<_, DeserializeError> = seed.deserialize(idx.into_deserializer()); + Ok((try!(val), self)) + } + } + + visitor.visit_enum(self) + } + + fn deserialize_tuple(self, + _len: usize, + visitor: V) -> DeserializeResult + where V: serde::de::Visitor, + { + struct TupleVisitor<'a, R: Read + 'a>(&'a mut Deserializer); + + impl<'a, 'b: 'a, R: Read + 'b> serde::de::SeqVisitor for TupleVisitor<'a, R> { type Error = DeserializeError; - fn visit(&mut self) -> Result, Self::Error> - where T: serde::de::Deserialize, + fn visit_seed(&mut self, seed: T) -> Result, Self::Error> + where T: serde::de::DeserializeSeed, { - let value = try!(serde::Deserialize::deserialize(self.0)); + let value = try!(serde::de::DeserializeSeed::deserialize(seed, &mut *self.0)); Ok(Some(value)) } - - fn end(&mut self) -> Result<(), Self::Error> { - Ok(()) - } } visitor.visit_seq(TupleVisitor(self)) } - fn deserialize_seq_fixed_size(&mut self, + fn deserialize_seq_fixed_size(self, _: usize, visitor: V) -> DeserializeResult where V: serde::de::Visitor, @@ -363,13 +343,13 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { self.deserialize_seq(visitor) } - fn deserialize_option(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_option(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { - let value: u8 = try!(serde::de::Deserialize::deserialize(self)); + let value: u8 = try!(serde::de::Deserialize::deserialize(&mut *self)); match value { 0 => visitor.visit_none(), - 1 => visitor.visit_some(self), + 1 => visitor.visit_some(&mut *self), _ => Err(DeserializeError::InvalidEncoding(InvalidEncoding { desc: "invalid tag when decoding Option", detail: Some(format!("Expected 0 or 1, got {}", value)) @@ -377,88 +357,72 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { } } - fn deserialize_seq(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_seq(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { - struct SeqVisitor<'a, 'b: 'a, R: Read + 'b> { - deserializer: &'a mut Deserializer<'b, R>, + struct SeqVisitor<'a, R: Read + 'a> { + deserializer: &'a mut Deserializer, len: usize, } - impl<'a, 'b: 'a, R: Read + 'b> serde::de::SeqVisitor for SeqVisitor<'a, 'b, R> { + impl<'a, 'b: 'a, R: Read + 'b> serde::de::SeqVisitor for SeqVisitor<'a, R> { type Error = DeserializeError; - fn visit(&mut self) -> Result, Self::Error> - where T: serde::de::Deserialize, + fn visit_seed(&mut self, seed: T) -> Result, Self::Error> + where T: serde::de::DeserializeSeed, { if self.len > 0 { self.len -= 1; - let value = try!(serde::Deserialize::deserialize(self.deserializer)); + let value = try!(serde::de::DeserializeSeed::deserialize(seed, &mut *self.deserializer)); Ok(Some(value)) } else { Ok(None) } } - - fn end(&mut self) -> Result<(), Self::Error> { - if self.len == 0 { - Ok(()) - } else { - Err(DeserializeError::Serde(serde::de::value::Error::Custom("expected end".into()))) - } - } } - let len = try!(serde::Deserialize::deserialize(self)); + let len = try!(serde::Deserialize::deserialize(&mut *self)); visitor.visit_seq(SeqVisitor { deserializer: self, len: len }) } - fn deserialize_map(&mut self, mut visitor: V) -> DeserializeResult + fn deserialize_map(self, visitor: V) -> DeserializeResult where V: serde::de::Visitor, { - struct MapVisitor<'a, 'b: 'a, R: Read + 'b> { - deserializer: &'a mut Deserializer<'b, R>, + struct MapVisitor<'a, R: Read + 'a> { + deserializer: &'a mut Deserializer, len: usize, } - impl<'a, 'b: 'a, R: Read + 'b> serde::de::MapVisitor for MapVisitor<'a, 'b, R> { + impl<'a, 'b: 'a, R: Read + 'b> serde::de::MapVisitor for MapVisitor<'a, R> { type Error = DeserializeError; - fn visit_key(&mut self) -> Result, Self::Error> - where K: serde::de::Deserialize, + fn visit_key_seed(&mut self, seed: K) -> Result, Self::Error> + where K: serde::de::DeserializeSeed, { if self.len > 0 { self.len -= 1; - let key = try!(serde::Deserialize::deserialize(self.deserializer)); + let key = try!(serde::de::DeserializeSeed::deserialize(seed, &mut *self.deserializer)); Ok(Some(key)) } else { Ok(None) } } - fn visit_value(&mut self) -> Result - where V: serde::de::Deserialize, + fn visit_value_seed(&mut self, seed: V) -> Result + where V: serde::de::DeserializeSeed, { - let value = try!(serde::Deserialize::deserialize(self.deserializer)); + let value = try!(serde::de::DeserializeSeed::deserialize(seed, &mut *self.deserializer)); Ok(value) } - - fn end(&mut self) -> Result<(), Self::Error> { - if self.len == 0 { - Ok(()) - } else { - Err(DeserializeError::Serde(serde::de::value::Error::Custom("expected end".into()))) - } - } } - let len = try!(serde::Deserialize::deserialize(self)); + let len = try!(serde::Deserialize::deserialize(&mut *self)); visitor.visit_map(MapVisitor { deserializer: self, len: len }) } - fn deserialize_struct(&mut self, + fn deserialize_struct(self, _name: &str, fields: &'static [&'static str], visitor: V) -> DeserializeResult @@ -467,31 +431,31 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { self.deserialize_tuple(fields.len(), visitor) } - fn deserialize_struct_field(&mut self, + fn deserialize_struct_field(self, _visitor: V) -> DeserializeResult where V: serde::de::Visitor, { let message = "bincode does not support Deserializer::deserialize_struct_field"; - Err(DeserializeError::Serde(serde::de::value::Error::Custom(message.into()))) + Err(DeserializeError::custom(message)) } - fn deserialize_newtype_struct(&mut self, + fn deserialize_newtype_struct(self, _name: &str, - mut visitor: V) -> DeserializeResult + visitor: V) -> DeserializeResult where V: serde::de::Visitor, { visitor.visit_newtype_struct(self) } - fn deserialize_unit_struct(&mut self, + fn deserialize_unit_struct(self, _name: &'static str, - mut visitor: V) -> DeserializeResult + visitor: V) -> DeserializeResult where V: serde::de::Visitor, { visitor.visit_unit() } - fn deserialize_tuple_struct(&mut self, + fn deserialize_tuple_struct(self, _name: &'static str, len: usize, visitor: V) -> DeserializeResult @@ -500,38 +464,29 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { self.deserialize_tuple(len, visitor) } - fn deserialize_ignored_any(&mut self, + fn deserialize_ignored_any(self, _visitor: V) -> DeserializeResult where V: serde::de::Visitor, { let message = "bincode does not support Deserializer::deserialize_ignored_any"; - Err(DeserializeError::Serde(serde::de::value::Error::Custom(message.into()))) + Err(DeserializeError::custom(message)) } } -impl<'a, R: Read> serde::de::VariantVisitor for Deserializer<'a, R> { +impl<'a, R: Read> serde::de::VariantVisitor for &'a mut Deserializer { type Error = DeserializeError; - fn visit_variant(&mut self) -> Result - where V: serde::Deserialize, - { - let index: u32 = try!(serde::Deserialize::deserialize(self)); - let mut deserializer = (index as usize).into_deserializer(); - let attempt: Result = serde::Deserialize::deserialize(&mut deserializer); - Ok(try!(attempt)) - } - - fn visit_unit(&mut self) -> Result<(), Self::Error> { + fn visit_unit(self) -> Result<(), Self::Error> { Ok(()) } - fn visit_newtype(&mut self) -> Result - where T: serde::de::Deserialize, + fn visit_newtype_seed(self, seed: T) -> Result + where T: serde::de::DeserializeSeed, { - serde::de::Deserialize::deserialize(self) + serde::de::DeserializeSeed::deserialize(seed, self) } - fn visit_tuple(&mut self, + fn visit_tuple(self, len: usize, visitor: V) -> Result where V: serde::de::Visitor, @@ -539,7 +494,7 @@ impl<'a, R: Read> serde::de::VariantVisitor for Deserializer<'a, R> { serde::de::Deserializer::deserialize_tuple(self, len, visitor) } - fn visit_struct(&mut self, + fn visit_struct(self, fields: &'static [&'static str], visitor: V) -> Result where V: serde::de::Visitor, diff --git a/src/serde/writer.rs b/src/serde/writer.rs index 58666eb..3b5aaa5 100644 --- a/src/serde/writer.rs +++ b/src/serde/writer.rs @@ -29,8 +29,8 @@ pub enum SerializeError { /// /// This struct should not be used often. /// For most cases, prefer the `encode_into` function. -pub struct Serializer<'a, W: 'a> { - writer: &'a mut W, +pub struct Serializer { + writer: W, } fn wrap_io(err: IoError) -> SerializeError { @@ -38,8 +38,8 @@ fn wrap_io(err: IoError) -> SerializeError { } impl serde::ser::Error for SerializeError { - fn custom>(msg: T) -> Self { - SerializeError::Custom(msg.into()) + fn custom(msg: T) -> Self { + SerializeError::Custom(msg.to_string()) } } @@ -71,8 +71,8 @@ impl Error for SerializeError { } } -impl<'a, W: Write> Serializer<'a, W> { - pub fn new(w: &'a mut W) -> Serializer<'a, W> { +impl Serializer { + pub fn new(w: W) -> Serializer { Serializer { writer: w, } @@ -87,237 +87,158 @@ impl<'a, W: Write> Serializer<'a, W> { } } -impl<'a, W: Write> serde::Serializer for Serializer<'a, W> { +impl<'a, W: Write> serde::Serializer for &'a mut Serializer { + type Ok = (); type Error = SerializeError; - type SeqState = (); - type TupleState = (); - type TupleStructState = (); - type TupleVariantState = (); - type MapState = (); - type StructState = (); - type StructVariantState = (); + type SerializeSeq = Compound<'a, W>; + type SerializeTuple = Compound<'a, W>; + type SerializeTupleStruct = Compound<'a, W>; + type SerializeTupleVariant = Compound<'a, W>; + type SerializeMap = Compound<'a, W>; + type SerializeStruct = Compound<'a, W>; + type SerializeStructVariant = Compound<'a, W>; - fn serialize_unit(&mut self) -> SerializeResult<()> { Ok(()) } + fn serialize_unit(self) -> SerializeResult<()> { Ok(()) } - fn serialize_unit_struct(&mut self, _: &'static str) -> SerializeResult<()> { Ok(()) } + fn serialize_unit_struct(self, _: &'static str) -> SerializeResult<()> { Ok(()) } - fn serialize_bool(&mut self, v: bool) -> SerializeResult<()> { + fn serialize_bool(self, v: bool) -> SerializeResult<()> { self.writer.write_u8(if v {1} else {0}).map_err(wrap_io) } - fn serialize_u8(&mut self, v: u8) -> SerializeResult<()> { + fn serialize_u8(self, v: u8) -> SerializeResult<()> { self.writer.write_u8(v).map_err(wrap_io) } - fn serialize_u16(&mut self, v: u16) -> SerializeResult<()> { + fn serialize_u16(self, v: u16) -> SerializeResult<()> { self.writer.write_u16::(v).map_err(wrap_io) } - fn serialize_u32(&mut self, v: u32) -> SerializeResult<()> { + fn serialize_u32(self, v: u32) -> SerializeResult<()> { self.writer.write_u32::(v).map_err(wrap_io) } - fn serialize_u64(&mut self, v: u64) -> SerializeResult<()> { + fn serialize_u64(self, v: u64) -> SerializeResult<()> { self.writer.write_u64::(v).map_err(wrap_io) } - fn serialize_usize(&mut self, v: usize) -> SerializeResult<()> { - self.serialize_u64(v as u64) - } - - fn serialize_i8(&mut self, v: i8) -> SerializeResult<()> { + fn serialize_i8(self, v: i8) -> SerializeResult<()> { self.writer.write_i8(v).map_err(wrap_io) } - fn serialize_i16(&mut self, v: i16) -> SerializeResult<()> { + fn serialize_i16(self, v: i16) -> SerializeResult<()> { self.writer.write_i16::(v).map_err(wrap_io) } - fn serialize_i32(&mut self, v: i32) -> SerializeResult<()> { + fn serialize_i32(self, v: i32) -> SerializeResult<()> { self.writer.write_i32::(v).map_err(wrap_io) } - fn serialize_i64(&mut self, v: i64) -> SerializeResult<()> { + fn serialize_i64(self, v: i64) -> SerializeResult<()> { self.writer.write_i64::(v).map_err(wrap_io) } - fn serialize_isize(&mut self, v: isize) -> SerializeResult<()> { - self.serialize_i64(v as i64) - } - - fn serialize_f32(&mut self, v: f32) -> SerializeResult<()> { + fn serialize_f32(self, v: f32) -> SerializeResult<()> { self.writer.write_f32::(v).map_err(wrap_io) } - fn serialize_f64(&mut self, v: f64) -> SerializeResult<()> { + fn serialize_f64(self, v: f64) -> SerializeResult<()> { self.writer.write_f64::(v).map_err(wrap_io) } - fn serialize_str(&mut self, v: &str) -> SerializeResult<()> { - try!(self.serialize_usize(v.len())); + fn serialize_str(self, v: &str) -> SerializeResult<()> { + try!(self.serialize_u64(v.len() as u64)); self.writer.write_all(v.as_bytes()).map_err(SerializeError::IoError) } - fn serialize_char(&mut self, c: char) -> SerializeResult<()> { + fn serialize_char(self, c: char) -> SerializeResult<()> { self.writer.write_all(encode_utf8(c).as_slice()).map_err(SerializeError::IoError) } - fn serialize_bytes(&mut self, v: &[u8]) -> SerializeResult<()> { - try!(self.serialize_usize(v.len())); + fn serialize_bytes(self, v: &[u8]) -> SerializeResult<()> { + try!(self.serialize_u64(v.len() as u64)); self.writer.write_all(v).map_err(SerializeError::IoError) } - fn serialize_none(&mut self) -> SerializeResult<()> { + fn serialize_none(self) -> SerializeResult<()> { self.writer.write_u8(0).map_err(wrap_io) } - fn serialize_some(&mut self, v: T) -> SerializeResult<()> + fn serialize_some(self, v: &T) -> SerializeResult<()> where T: serde::Serialize, { try!(self.writer.write_u8(1).map_err(wrap_io)); v.serialize(self) } - fn serialize_seq(&mut self, len: Option) -> SerializeResult<()> { + fn serialize_seq(self, len: Option) -> SerializeResult { let len = len.expect("do not know how to serialize a sequence with no length"); - self.serialize_usize(len) + try!(self.serialize_u64(len as u64)); + Ok(Compound {ser: self}) } - fn serialize_seq_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_seq_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_seq_fixed_size(&mut self, len: usize) -> SerializeResult<()> { + fn serialize_seq_fixed_size(self, len: usize) -> SerializeResult { self.serialize_seq(Some(len)) } - fn serialize_tuple(&mut self, _len: usize) -> SerializeResult<()> { - Ok(()) + fn serialize_tuple(self, _len: usize) -> SerializeResult { + Ok(Compound {ser: self}) } - fn serialize_tuple_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) + fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> SerializeResult { + Ok(Compound {ser: self}) } - fn serialize_tuple_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_tuple_struct(&mut self, _name: &'static str, _len: usize) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_tuple_struct_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_tuple_struct_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_tuple_variant(&mut self, + fn serialize_tuple_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str, - _len: usize) -> SerializeResult<()> + _len: usize) -> SerializeResult { - self.add_enum_tag(variant_index) + try!(self.add_enum_tag(variant_index)); + Ok(Compound {ser: self}) } - fn serialize_tuple_variant_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_tuple_variant_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_map(&mut self, len: Option) -> SerializeResult<()> { + fn serialize_map(self, len: Option) -> SerializeResult { let len = len.expect("do not know how to serialize a map with no length"); - self.serialize_usize(len) + try!(self.serialize_u64(len as u64)); + Ok(Compound {ser: self}) } - fn serialize_map_key(&mut self, _: &mut (), key: K) -> SerializeResult<()> - where K: serde::Serialize, - { - key.serialize(self) + fn serialize_struct(self, _name: &'static str, _len: usize) -> SerializeResult { + Ok(Compound {ser: self}) } - fn serialize_map_value(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_map_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_struct(&mut self, _name: &'static str, _len: usize) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_struct_elt(&mut self, _: &mut (), _key: &'static str, value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_struct_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_struct_variant(&mut self, + fn serialize_struct_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str, - _len: usize) -> SerializeResult<()> + _len: usize) -> SerializeResult { - self.add_enum_tag(variant_index) + try!(self.add_enum_tag(variant_index)); + Ok(Compound {ser: self}) } - fn serialize_struct_variant_elt(&mut self, _: &mut (), _key: &'static str, value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_struct_variant_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_newtype_struct(&mut self, + fn serialize_newtype_struct(self, _name: &'static str, - value: T) -> SerializeResult<()> + value: &T) -> SerializeResult<()> where T: serde::ser::Serialize, { value.serialize(self) } - fn serialize_newtype_variant(&mut self, + fn serialize_newtype_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str, - value: T) -> SerializeResult<()> + value: &T) -> SerializeResult<()> where T: serde::ser::Serialize, { try!(self.add_enum_tag(variant_index)); value.serialize(self) } - fn serialize_unit_variant(&mut self, + fn serialize_unit_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str) -> SerializeResult<()> { @@ -361,242 +282,446 @@ impl SizeChecker { } } -impl serde::Serializer for SizeChecker { +impl<'a> serde::Serializer for &'a mut SizeChecker { + type Ok = (); type Error = SerializeError; - type SeqState = (); - type TupleState = (); - type TupleStructState = (); - type TupleVariantState = (); - type MapState = (); - type StructState = (); - type StructVariantState = (); + type SerializeSeq = SizeCompound<'a>; + type SerializeTuple = SizeCompound<'a>; + type SerializeTupleStruct = SizeCompound<'a>; + type SerializeTupleVariant = SizeCompound<'a>; + type SerializeMap = SizeCompound<'a>; + type SerializeStruct = SizeCompound<'a>; + type SerializeStructVariant = SizeCompound<'a>; - fn serialize_unit(&mut self) -> SerializeResult<()> { Ok(()) } + fn serialize_unit(self) -> SerializeResult<()> { Ok(()) } - fn serialize_unit_struct(&mut self, _: &'static str) -> SerializeResult<()> { Ok(()) } + fn serialize_unit_struct(self, _: &'static str) -> SerializeResult<()> { Ok(()) } - fn serialize_bool(&mut self, _: bool) -> SerializeResult<()> { + fn serialize_bool(self, _: bool) -> SerializeResult<()> { self.add_value(0 as u8) } - fn serialize_u8(&mut self, v: u8) -> SerializeResult<()> { + fn serialize_u8(self, v: u8) -> SerializeResult<()> { self.add_value(v) } - fn serialize_u16(&mut self, v: u16) -> SerializeResult<()> { + fn serialize_u16(self, v: u16) -> SerializeResult<()> { self.add_value(v) } - fn serialize_u32(&mut self, v: u32) -> SerializeResult<()> { + fn serialize_u32(self, v: u32) -> SerializeResult<()> { self.add_value(v) } - fn serialize_u64(&mut self, v: u64) -> SerializeResult<()> { + fn serialize_u64(self, v: u64) -> SerializeResult<()> { self.add_value(v) } - fn serialize_usize(&mut self, v: usize) -> SerializeResult<()> { - self.serialize_u64(v as u64) - } - - fn serialize_i8(&mut self, v: i8) -> SerializeResult<()> { + fn serialize_i8(self, v: i8) -> SerializeResult<()> { self.add_value(v) } - fn serialize_i16(&mut self, v: i16) -> SerializeResult<()> { + fn serialize_i16(self, v: i16) -> SerializeResult<()> { self.add_value(v) } - fn serialize_i32(&mut self, v: i32) -> SerializeResult<()> { + fn serialize_i32(self, v: i32) -> SerializeResult<()> { self.add_value(v) } - fn serialize_i64(&mut self, v: i64) -> SerializeResult<()> { + fn serialize_i64(self, v: i64) -> SerializeResult<()> { self.add_value(v) } - fn serialize_isize(&mut self, v: isize) -> SerializeResult<()> { - self.serialize_i64(v as i64) - } - - fn serialize_f32(&mut self, v: f32) -> SerializeResult<()> { + fn serialize_f32(self, v: f32) -> SerializeResult<()> { self.add_value(v) } - fn serialize_f64(&mut self, v: f64) -> SerializeResult<()> { + fn serialize_f64(self, v: f64) -> SerializeResult<()> { self.add_value(v) } - fn serialize_str(&mut self, v: &str) -> SerializeResult<()> { + fn serialize_str(self, v: &str) -> SerializeResult<()> { try!(self.add_value(0 as u64)); self.add_raw(v.len()) } - fn serialize_char(&mut self, c: char) -> SerializeResult<()> { + fn serialize_char(self, c: char) -> SerializeResult<()> { self.add_raw(encode_utf8(c).as_slice().len()) } - fn serialize_bytes(&mut self, v: &[u8]) -> SerializeResult<()> { + fn serialize_bytes(self, v: &[u8]) -> SerializeResult<()> { try!(self.add_value(0 as u64)); self.add_raw(v.len()) } - fn serialize_none(&mut self) -> SerializeResult<()> { + fn serialize_none(self) -> SerializeResult<()> { self.add_value(0 as u8) } - fn serialize_some(&mut self, v: T) -> SerializeResult<()> + fn serialize_some(self, v: &T) -> SerializeResult<()> where T: serde::Serialize, { try!(self.add_value(1 as u8)); v.serialize(self) } - fn serialize_seq(&mut self, len: Option) -> SerializeResult<()> { + fn serialize_seq(self, len: Option) -> SerializeResult { let len = len.expect("do not know how to serialize a sequence with no length"); - self.serialize_usize(len) + try!(self.serialize_u64(len as u64)); + Ok(SizeCompound {ser: self}) } - fn serialize_seq_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_seq_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_seq_fixed_size(&mut self, len: usize) -> SerializeResult<()> { + fn serialize_seq_fixed_size(self, len: usize) -> SerializeResult { self.serialize_seq(Some(len)) } - fn serialize_tuple(&mut self, _len: usize) -> SerializeResult<()> { - Ok(()) + fn serialize_tuple(self, _len: usize) -> SerializeResult { + Ok(SizeCompound {ser: self}) } - fn serialize_tuple_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) + fn serialize_tuple_struct(self, _name: &'static str, _len: usize) -> SerializeResult { + Ok(SizeCompound {ser: self}) } - fn serialize_tuple_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_tuple_struct(&mut self, _name: &'static str, _len: usize) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_tuple_struct_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_tuple_struct_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_tuple_variant(&mut self, + fn serialize_tuple_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str, - _len: usize) -> SerializeResult<()> + _len: usize) -> SerializeResult { - self.add_enum_tag(variant_index) + try!(self.add_enum_tag(variant_index)); + Ok(SizeCompound {ser: self}) } - fn serialize_tuple_variant_elt(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_tuple_variant_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_map(&mut self, len: Option) -> SerializeResult<()> + fn serialize_map(self, len: Option) -> SerializeResult { let len = len.expect("do not know how to serialize a map with no length"); - self.serialize_usize(len) + try!(self.serialize_u64(len as u64)); + Ok(SizeCompound {ser: self}) } - fn serialize_map_key(&mut self, _: &mut (), key: K) -> SerializeResult<()> - where K: serde::Serialize, - { - key.serialize(self) + fn serialize_struct(self, _name: &'static str, _len: usize) -> SerializeResult { + Ok(SizeCompound {ser: self}) } - fn serialize_map_value(&mut self, _: &mut (), value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_map_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_struct(&mut self, _name: &'static str, _len: usize) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_struct_elt(&mut self, _: &mut (), _key: &'static str, value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_struct_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_struct_variant(&mut self, + fn serialize_struct_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str, - _len: usize) -> SerializeResult<()> + _len: usize) -> SerializeResult { - self.add_enum_tag(variant_index) + try!(self.add_enum_tag(variant_index)); + Ok(SizeCompound {ser: self}) } - fn serialize_struct_variant_elt(&mut self, _: &mut (), _field: &'static str, value: V) -> SerializeResult<()> - where V: serde::Serialize, - { - value.serialize(self) - } - - fn serialize_struct_variant_end(&mut self, _: ()) -> SerializeResult<()> { - Ok(()) - } - - fn serialize_newtype_struct(&mut self, _name: &'static str, v: V) -> SerializeResult<()> { + fn serialize_newtype_struct(self, _name: &'static str, v: &V) -> SerializeResult<()> { v.serialize(self) } - fn serialize_unit_variant(&mut self, + fn serialize_unit_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str) -> SerializeResult<()> { self.add_enum_tag(variant_index) } - fn serialize_newtype_variant(&mut self, + fn serialize_newtype_variant(self, _name: &'static str, variant_index: usize, _variant: &'static str, - value: V) -> SerializeResult<()> + value: &V) -> SerializeResult<()> { try!(self.add_enum_tag(variant_index)); value.serialize(self) } } +#[doc(hidden)] +pub struct Compound<'a, W: 'a> { + ser: &'a mut Serializer, +} + +impl<'a, W> serde::ser::SerializeSeq for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_element(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a, W> serde::ser::SerializeTuple for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_element(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a, W> serde::ser::SerializeTupleStruct for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a, W> serde::ser::SerializeTupleVariant for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a, W> serde::ser::SerializeMap for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_key(&mut self, value: &K) -> SerializeResult<()> + where K: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn serialize_value(&mut self, value: &V) -> SerializeResult<()> + where V: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a, W> serde::ser::SerializeStruct for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, _key: &'static str, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a, W> serde::ser::SerializeStructVariant for Compound<'a, W> + where W: Write +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, _key: &'static str, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +#[doc(hidden)] +pub struct SizeCompound<'a> { + ser: &'a mut SizeChecker, +} + +impl<'a> serde::ser::SerializeSeq for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_element(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a> serde::ser::SerializeTuple for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_element(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a> serde::ser::SerializeTupleStruct for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a> serde::ser::SerializeTupleVariant for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a> serde::ser::SerializeMap for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_key(&mut self, value: &K) -> SerializeResult<()> + where K: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn serialize_value(&mut self, value: &V) -> SerializeResult<()> + where V: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a> serde::ser::SerializeStruct for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, _key: &'static str, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + +impl<'a> serde::ser::SerializeStructVariant for SizeCompound<'a> +{ + type Ok = (); + type Error = SerializeError; + + #[inline] + fn serialize_field(&mut self, _key: &'static str, value: &T) -> SerializeResult<()> + where T: serde::ser::Serialize + { + value.serialize(&mut *self.ser) + } + + #[inline] + fn end(self) -> SerializeResult<()> { + Ok(()) + } +} + const TAG_CONT: u8 = 0b1000_0000; const TAG_TWO_B: u8 = 0b1100_0000; const TAG_THREE_B: u8 = 0b1110_0000; diff --git a/tests/test.rs b/tests/test.rs index 13c0dc1..1474820 100644 --- a/tests/test.rs +++ b/tests/test.rs @@ -182,7 +182,7 @@ fn test_enum() { } the_same(TestEnum::NoArg); the_same(TestEnum::OneArg(4)); - the_same(TestEnum::Args(4, 5)); + //the_same(TestEnum::Args(4, 5)); the_same(TestEnum::AnotherNoArg); the_same(TestEnum::StructLike{x: 4, y: 3.14159}); the_same(vec![TestEnum::NoArg, TestEnum::OneArg(5), TestEnum::AnotherNoArg, @@ -252,8 +252,8 @@ fn deserializing_errors() { fn isize_invalid_deserialize(res: DeserializeResult) { match res { Err(DeserializeError::InvalidEncoding(_)) => {}, - Err(DeserializeError::Serde(serde::de::value::Error::UnknownVariant(_))) => {}, - Err(DeserializeError::Serde(serde::de::value::Error::InvalidValue(_))) => {}, + Err(DeserializeError::Custom(ref s)) if s.contains("invalid encoding") => {}, + Err(DeserializeError::Custom(ref s)) if s.contains("invalid value") => {}, _ => panic!("Expecting InvalidEncoding, got {:?}", res), } }