From 871fb5adee212a4e65c813a3d99748ae27eb168f Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 23 Dec 2016 23:17:42 -0500 Subject: [PATCH] Support deserializing ByteBuf from string --- serde/src/bytes.rs | 14 ++- testing/tests/test.rs.in | 1 + testing/tests/test_bytes.rs | 195 ++++++++---------------------------- 3 files changed, 54 insertions(+), 156 deletions(-) diff --git a/serde/src/bytes.rs b/serde/src/bytes.rs index a732712c..db98f2d8 100644 --- a/serde/src/bytes.rs +++ b/serde/src/bytes.rs @@ -208,7 +208,7 @@ mod bytebuf { fn visit_bytes(&mut self, v: &[u8]) -> Result where E: de::Error, { - self.visit_byte_buf(v.to_vec()) + Ok(ByteBuf::from(v)) } #[inline] @@ -217,6 +217,18 @@ mod bytebuf { { Ok(ByteBuf::from(v)) } + + fn visit_str(&mut self, v: &str) -> Result + where E: de::Error, + { + Ok(ByteBuf::from(v)) + } + + fn visit_string(&mut self, v: String) -> Result + where E: de::Error, + { + Ok(ByteBuf::from(v)) + } } impl de::Deserialize for ByteBuf { diff --git a/testing/tests/test.rs.in b/testing/tests/test.rs.in index fca1ff46..04c69bdb 100644 --- a/testing/tests/test.rs.in +++ b/testing/tests/test.rs.in @@ -1,4 +1,5 @@ extern crate serde; +extern crate serde_test; #[macro_use] mod macros; diff --git a/testing/tests/test_bytes.rs b/testing/tests/test_bytes.rs index fd707e21..a0e5fbcc 100644 --- a/testing/tests/test_bytes.rs +++ b/testing/tests/test_bytes.rs @@ -1,11 +1,13 @@ use std::fmt; use std::error; -use serde::{Serialize, Serializer, Deserialize, Deserializer}; +use serde::{Serialize, Serializer}; use serde::bytes::{ByteBuf, Bytes}; use serde::ser; use serde::de; +use serde_test::{assert_de_tokens, Token}; + /////////////////////////////////////////////////////////////////////////////// #[derive(Debug, PartialEq)] @@ -286,153 +288,6 @@ impl Serializer for BytesSerializer { /////////////////////////////////////////////////////////////////////////////// -struct BytesDeserializer { - bytes: Option>, -} - -impl BytesDeserializer { - fn new(bytes: Vec) -> Self { - BytesDeserializer { - bytes: Some(bytes), - } - } -} - -impl Deserializer for BytesDeserializer { - type Error = Error; - - fn deserialize(&mut self, _visitor: V) -> Result - where V: de::Visitor, - { - Err(Error) - } - - fn deserialize_bytes(&mut self, mut visitor: V) -> Result - where V: de::Visitor, - { - visitor.visit_byte_buf(self.bytes.take().unwrap()) - } - - fn deserialize_seq<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_struct_field<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_map<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_unit<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_ignored_any<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_string<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_str<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_char<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_i64<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_i32<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_i16<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_i8<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_u64<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_u32<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_u16<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_u8<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_f32<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_f64<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_bool<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_usize<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_isize<__V>(&mut self, visitor: __V) -> Result<__V::Value, Self::Error> - where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_option<__V>(&mut self, visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_seq_fixed_size<__V>(&mut self, _: usize, visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_unit_struct<__V>(&mut self, _: &str, visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_newtype_struct<__V>(&mut self, _: &str, visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_tuple_struct<__V>(&mut self, _: &str, _: usize, visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_struct<__V>(&mut self, _: &str, _: &[&str], visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_tuple<__V>(&mut self, _: usize, visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::Visitor { - self.deserialize(visitor) - } - fn deserialize_enum<__V>(&mut self, _: &str, _: &[&str], _visitor: __V) - -> Result<__V::Value, Self::Error> where __V: de::EnumVisitor { - Err(Error) - } -} - -/////////////////////////////////////////////////////////////////////////////// - #[test] fn test_bytes_ser_bytes() { let buf = vec![]; @@ -449,12 +304,42 @@ fn test_bytes_ser_bytes() { /////////////////////////////////////////////////////////////////////////////// #[test] -fn test_byte_buf_de_bytes() { - let mut de = BytesDeserializer::new(vec![]); - let bytes = Deserialize::deserialize(&mut de); - assert_eq!(bytes, Ok(ByteBuf::new())); +fn test_byte_buf_de() { + let empty = ByteBuf::new(); + assert_de_tokens(&empty, &[Token::Bytes(b""),]); + assert_de_tokens(&empty, &[Token::Str("")]); + assert_de_tokens(&empty, &[Token::String(String::new())]); + assert_de_tokens(&empty, &[ + Token::SeqStart(None), + Token::SeqEnd, + ]); + assert_de_tokens(&empty, &[ + Token::SeqStart(Some(0)), + Token::SeqEnd, + ]); - let mut de = BytesDeserializer::new(vec![1, 2, 3]); - let bytes = Deserialize::deserialize(&mut de); - assert_eq!(bytes, Ok(ByteBuf::from(vec![1, 2, 3]))); + let buf = ByteBuf::from(vec![65, 66, 67]); + assert_de_tokens(&buf, &[Token::Bytes(b"ABC")]); + assert_de_tokens(&buf, &[Token::Str("ABC")]); + assert_de_tokens(&buf, &[Token::String("ABC".to_owned())]); + assert_de_tokens(&buf, &[ + Token::SeqStart(None), + Token::SeqSep, + Token::U8(65), + Token::SeqSep, + Token::U8(66), + Token::SeqSep, + Token::U8(67), + Token::SeqEnd, + ]); + assert_de_tokens(&buf, &[ + Token::SeqStart(Some(3)), + Token::SeqSep, + Token::U8(65), + Token::SeqSep, + Token::U8(66), + Token::SeqSep, + Token::U8(67), + Token::SeqEnd, + ]); }