Merge branch 'serde3' of https://github.com/erickt/bincode into serde3

This commit is contained in:
Ty Overby 2015-08-07 15:14:38 -07:00
commit 0c4403021d
3 changed files with 45 additions and 28 deletions

View File

@ -131,19 +131,19 @@ impl fmt::Display for DeserializeError {
} }
impl serde::de::Error for DeserializeError { impl serde::de::Error for DeserializeError {
fn syntax_error() -> DeserializeError { fn syntax(_: &str) -> DeserializeError {
DeserializeError::SyntaxError DeserializeError::SyntaxError
} }
fn end_of_stream_error() -> DeserializeError { fn end_of_stream() -> DeserializeError {
DeserializeError::EndOfStreamError DeserializeError::EndOfStreamError
} }
fn unknown_field_error(_field: &str) -> DeserializeError { fn unknown_field(_field: &str) -> DeserializeError {
DeserializeError::UnknownFieldError DeserializeError::UnknownFieldError
} }
fn missing_field_error(_field: &'static str) -> DeserializeError { fn missing_field(_field: &'static str) -> DeserializeError {
DeserializeError::MissingFieldError DeserializeError::MissingFieldError
} }
} }
@ -213,7 +213,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> {
fn visit<V>(&mut self, _visitor: V) -> DeserializeResult<V::Value> fn visit<V>(&mut self, _visitor: V) -> DeserializeResult<V::Value>
where V: serde::de::Visitor, where V: serde::de::Visitor,
{ {
Err(serde::de::Error::syntax_error()) Err(serde::de::Error::syntax("bincode does not support Deserializer::visit"))
} }
fn visit_bool<V>(&mut self, mut visitor: V) -> DeserializeResult<V::Value> fn visit_bool<V>(&mut self, mut visitor: V) -> DeserializeResult<V::Value>
@ -252,7 +252,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> {
let value = try!(self.reader.read_u64::<BigEndian>()); let value = try!(self.reader.read_u64::<BigEndian>());
match num::cast(value) { match num::cast(value) {
Some(value) => visitor.visit_usize(value), Some(value) => visitor.visit_usize(value),
None => Err(serde::de::Error::syntax_error()), None => Err(serde::de::Error::syntax("expected usize")),
} }
} }
@ -276,7 +276,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> {
let value = try!(self.reader.read_i64::<BigEndian>()); let value = try!(self.reader.read_i64::<BigEndian>());
match num::cast(value) { match num::cast(value) {
Some(value) => visitor.visit_isize(value), Some(value) => visitor.visit_isize(value),
None => Err(serde::de::Error::syntax_error()), None => Err(serde::de::Error::syntax("expected isize")),
} }
} }
@ -421,7 +421,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> {
if self.len == 0 { if self.len == 0 {
Ok(()) Ok(())
} else { } else {
Err(serde::de::Error::syntax_error()) Err(serde::de::Error::syntax("expected end"))
} }
} }
} }
@ -465,7 +465,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> {
if self.len == 0 { if self.len == 0 {
Ok(()) Ok(())
} else { } else {
Err(serde::de::Error::syntax_error()) Err(serde::de::Error::syntax("expected end"))
} }
} }
} }
@ -483,6 +483,14 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> {
{ {
self.visit_tuple(fields.len(), visitor) self.visit_tuple(fields.len(), visitor)
} }
fn visit_newtype_struct<V>(&mut self,
_name: &str,
mut visitor: V) -> Result<V::Value, Self::Error>
where V: serde::de::Visitor,
{
visitor.visit_newtype_struct(self)
}
} }
impl<'a, R: Read> serde::de::VariantVisitor for Deserializer<'a, R> { impl<'a, R: Read> serde::de::VariantVisitor for Deserializer<'a, R> {
@ -500,6 +508,12 @@ impl<'a, R: Read> serde::de::VariantVisitor for Deserializer<'a, R> {
Ok(()) Ok(())
} }
fn visit_newtype<T>(&mut self) -> Result<T, Self::Error>
where T: serde::de::Deserialize,
{
serde::de::Deserialize::deserialize(self)
}
fn visit_tuple<V>(&mut self, fn visit_tuple<V>(&mut self,
len: usize, len: usize,
visitor: V) -> Result<V::Value, Self::Error> visitor: V) -> Result<V::Value, Self::Error>

View File

@ -211,9 +211,16 @@ impl<'a, W: Write> serde::Serializer for Serializer<'a, W> {
Ok(()) Ok(())
} }
fn visit_struct_elt<K, V>(&mut self, _key: K, value: V) -> SerializeResult<()> fn visit_struct_elt<V>(&mut self, _key: &str, value: V) -> SerializeResult<()>
where K: serde::Serialize, where V: serde::Serialize,
V: serde::Serialize, {
value.serialize(self)
}
fn visit_newtype_struct<T>(&mut self,
_name: &str,
value: T) -> SerializeResult<()>
where T: serde::ser::Serialize,
{ {
value.serialize(self) value.serialize(self)
} }
@ -415,9 +422,8 @@ impl serde::Serializer for SizeChecker {
Ok(()) Ok(())
} }
fn visit_struct_elt<K, V>(&mut self, _key: K, value: V) -> SerializeResult<()> fn visit_struct_elt<V>(&mut self, _key: &str, value: V) -> SerializeResult<()>
where K: serde::Serialize, where V: serde::Serialize,
V: serde::Serialize,
{ {
value.serialize(self) value.serialize(self)
} }

View File

@ -156,6 +156,14 @@ fn test_nested_struct() {
}); });
} }
#[test]
fn test_struct_newtype() {
#[derive(RustcEncodable, RustcDecodable, Serialize, Deserialize, PartialEq, Debug)]
struct NewtypeStr(usize);
the_same(NewtypeStr(5));
}
#[test] #[test]
fn test_struct_tuple() { fn test_struct_tuple() {
#[derive(RustcEncodable, RustcDecodable, Serialize, Deserialize, PartialEq, Debug)] #[derive(RustcEncodable, RustcDecodable, Serialize, Deserialize, PartialEq, Debug)]
@ -177,24 +185,13 @@ fn test_enum() {
enum TestEnum { enum TestEnum {
NoArg, NoArg,
OneArg(usize), OneArg(usize),
AnotherNoArg Args(usize, usize),
}
the_same(TestEnum::NoArg);
the_same(TestEnum::OneArg(4));
the_same(TestEnum::AnotherNoArg);
}
#[test]
fn test_struct_enum() {
#[derive(RustcEncodable, RustcDecodable, Serialize, Deserialize, PartialEq, Debug)]
enum TestEnum {
NoArg,
OneArg(usize),
AnotherNoArg, AnotherNoArg,
StructLike{x: usize, y: f32} StructLike{x: usize, y: f32}
} }
the_same(TestEnum::NoArg); the_same(TestEnum::NoArg);
the_same(TestEnum::OneArg(4)); the_same(TestEnum::OneArg(4));
the_same(TestEnum::Args(4, 5));
the_same(TestEnum::AnotherNoArg); the_same(TestEnum::AnotherNoArg);
the_same(TestEnum::StructLike{x: 4, y: 3.14159}); the_same(TestEnum::StructLike{x: 4, y: 3.14159});
the_same(vec![TestEnum::NoArg, TestEnum::OneArg(5), TestEnum::AnotherNoArg, the_same(vec![TestEnum::NoArg, TestEnum::OneArg(5), TestEnum::AnotherNoArg,