From f04635c1bada28c6cca6dca3763e11a3ebf7df8c Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Thu, 30 Jul 2015 20:45:36 -0700 Subject: [PATCH 1/2] Add newtype handlers to speed up parsing newtype structs and variants --- src/reader_serde.rs | 14 ++++++++++++++ src/writer_serde.rs | 8 ++++++++ tests/test_serde.rs | 23 ++++++++++------------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/reader_serde.rs b/src/reader_serde.rs index ec8ab7e..ca630d7 100644 --- a/src/reader_serde.rs +++ b/src/reader_serde.rs @@ -483,6 +483,14 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { { self.visit_tuple(fields.len(), visitor) } + + fn visit_newtype_struct(&mut self, + _name: &str, + mut visitor: V) -> Result + where V: serde::de::Visitor, + { + visitor.visit_newtype_struct(self) + } } 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(()) } + fn visit_newtype(&mut self) -> Result + where T: serde::de::Deserialize, + { + serde::de::Deserialize::deserialize(self) + } + fn visit_tuple(&mut self, len: usize, visitor: V) -> Result diff --git a/src/writer_serde.rs b/src/writer_serde.rs index abace1f..11d127d 100644 --- a/src/writer_serde.rs +++ b/src/writer_serde.rs @@ -218,6 +218,14 @@ impl<'a, W: Write> serde::Serializer for Serializer<'a, W> { value.serialize(self) } + fn visit_newtype_struct(&mut self, + _name: &str, + value: T) -> SerializeResult<()> + where T: serde::ser::Serialize, + { + value.serialize(self) + } + fn visit_unit_variant(&mut self, _name: &str, variant_index: usize, diff --git a/tests/test_serde.rs b/tests/test_serde.rs index fb8911d..3a0bde6 100644 --- a/tests/test_serde.rs +++ b/tests/test_serde.rs @@ -133,6 +133,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] fn test_struct_tuple() { #[derive(RustcEncodable, RustcDecodable, Serialize, Deserialize, PartialEq, Debug)] @@ -154,24 +162,13 @@ fn test_enum() { enum TestEnum { NoArg, OneArg(usize), - AnotherNoArg - } - 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), + Args(usize, usize), AnotherNoArg, StructLike{x: usize, y: f32} } the_same(TestEnum::NoArg); the_same(TestEnum::OneArg(4)); + 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, From b59af483ef96ad4d979f7a31cca1b2157142b3b8 Mon Sep 17 00:00:00 2001 From: Erick Tryzelaar Date: Fri, 7 Aug 2015 12:10:02 -0700 Subject: [PATCH 2/2] Updated to serde 0.5.0 --- src/reader_serde.rs | 18 +++++++++--------- src/writer_serde.rs | 10 ++++------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/reader_serde.rs b/src/reader_serde.rs index ca630d7..d675a42 100644 --- a/src/reader_serde.rs +++ b/src/reader_serde.rs @@ -131,19 +131,19 @@ impl fmt::Display for DeserializeError { } impl serde::de::Error for DeserializeError { - fn syntax_error() -> DeserializeError { + fn syntax(_: &str) -> DeserializeError { DeserializeError::SyntaxError } - fn end_of_stream_error() -> DeserializeError { + fn end_of_stream() -> DeserializeError { DeserializeError::EndOfStreamError } - fn unknown_field_error(_field: &str) -> DeserializeError { + fn unknown_field(_field: &str) -> DeserializeError { DeserializeError::UnknownFieldError } - fn missing_field_error(_field: &'static str) -> DeserializeError { + fn missing_field(_field: &'static str) -> DeserializeError { DeserializeError::MissingFieldError } } @@ -213,7 +213,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { fn visit(&mut self, _visitor: V) -> DeserializeResult 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(&mut self, mut visitor: V) -> DeserializeResult @@ -252,7 +252,7 @@ impl<'a, R: Read> serde::Deserializer for Deserializer<'a, R> { let value = try!(self.reader.read_u64::()); match num::cast(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::()); match num::cast(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 { Ok(()) } 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 { Ok(()) } else { - Err(serde::de::Error::syntax_error()) + Err(serde::de::Error::syntax("expected end")) } } } diff --git a/src/writer_serde.rs b/src/writer_serde.rs index 11d127d..bfccddf 100644 --- a/src/writer_serde.rs +++ b/src/writer_serde.rs @@ -211,9 +211,8 @@ impl<'a, W: Write> serde::Serializer for Serializer<'a, W> { Ok(()) } - fn visit_struct_elt(&mut self, _key: K, value: V) -> SerializeResult<()> - where K: serde::Serialize, - V: serde::Serialize, + fn visit_struct_elt(&mut self, _key: &str, value: V) -> SerializeResult<()> + where V: serde::Serialize, { value.serialize(self) } @@ -423,9 +422,8 @@ impl serde::Serializer for SizeChecker { Ok(()) } - fn visit_struct_elt(&mut self, _key: K, value: V) -> SerializeResult<()> - where K: serde::Serialize, - V: serde::Serialize, + fn visit_struct_elt(&mut self, _key: &str, value: V) -> SerializeResult<()> + where V: serde::Serialize, { value.serialize(self) }