Merge pull request #652 from serde-rs/bbstr
Support deserializing ByteBuf from string
This commit is contained in:
commit
a3f556959f
@ -84,7 +84,7 @@ mod bytebuf {
|
|||||||
use de;
|
use de;
|
||||||
|
|
||||||
#[cfg(feature = "collections")]
|
#[cfg(feature = "collections")]
|
||||||
use collections::Vec;
|
use collections::{String, Vec};
|
||||||
|
|
||||||
/// `ByteBuf` wraps a `Vec<u8>` and serializes as a byte array.
|
/// `ByteBuf` wraps a `Vec<u8>` and serializes as a byte array.
|
||||||
#[derive(Clone, Default, Eq, Hash, PartialEq, PartialOrd, Ord)]
|
#[derive(Clone, Default, Eq, Hash, PartialEq, PartialOrd, Ord)]
|
||||||
@ -208,7 +208,7 @@ mod bytebuf {
|
|||||||
fn visit_bytes<E>(&mut self, v: &[u8]) -> Result<ByteBuf, E>
|
fn visit_bytes<E>(&mut self, v: &[u8]) -> Result<ByteBuf, E>
|
||||||
where E: de::Error,
|
where E: de::Error,
|
||||||
{
|
{
|
||||||
self.visit_byte_buf(v.to_vec())
|
Ok(ByteBuf::from(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -217,6 +217,18 @@ mod bytebuf {
|
|||||||
{
|
{
|
||||||
Ok(ByteBuf::from(v))
|
Ok(ByteBuf::from(v))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(&mut self, v: &str) -> Result<ByteBuf, E>
|
||||||
|
where E: de::Error,
|
||||||
|
{
|
||||||
|
Ok(ByteBuf::from(v))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_string<E>(&mut self, v: String) -> Result<ByteBuf, E>
|
||||||
|
where E: de::Error,
|
||||||
|
{
|
||||||
|
Ok(ByteBuf::from(v))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl de::Deserialize for ByteBuf {
|
impl de::Deserialize for ByteBuf {
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
extern crate serde;
|
extern crate serde;
|
||||||
|
extern crate serde_test;
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod macros;
|
mod macros;
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::error;
|
use std::error;
|
||||||
|
|
||||||
use serde::{Serialize, Serializer, Deserialize, Deserializer};
|
use serde::{Serialize, Serializer};
|
||||||
use serde::bytes::{ByteBuf, Bytes};
|
use serde::bytes::{ByteBuf, Bytes};
|
||||||
use serde::ser;
|
use serde::ser;
|
||||||
use serde::de;
|
use serde::de;
|
||||||
|
|
||||||
|
use serde_test::{assert_de_tokens, Token};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
@ -286,153 +288,6 @@ impl Serializer for BytesSerializer {
|
|||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
struct BytesDeserializer {
|
|
||||||
bytes: Option<Vec<u8>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl BytesDeserializer {
|
|
||||||
fn new(bytes: Vec<u8>) -> Self {
|
|
||||||
BytesDeserializer {
|
|
||||||
bytes: Some(bytes),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Deserializer for BytesDeserializer {
|
|
||||||
type Error = Error;
|
|
||||||
|
|
||||||
fn deserialize<V>(&mut self, _visitor: V) -> Result<V::Value, Error>
|
|
||||||
where V: de::Visitor,
|
|
||||||
{
|
|
||||||
Err(Error)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn deserialize_bytes<V>(&mut self, mut visitor: V) -> Result<V::Value, Error>
|
|
||||||
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]
|
#[test]
|
||||||
fn test_bytes_ser_bytes() {
|
fn test_bytes_ser_bytes() {
|
||||||
let buf = vec![];
|
let buf = vec![];
|
||||||
@ -449,12 +304,42 @@ fn test_bytes_ser_bytes() {
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_byte_buf_de_bytes() {
|
fn test_byte_buf_de() {
|
||||||
let mut de = BytesDeserializer::new(vec![]);
|
let empty = ByteBuf::new();
|
||||||
let bytes = Deserialize::deserialize(&mut de);
|
assert_de_tokens(&empty, &[Token::Bytes(b""),]);
|
||||||
assert_eq!(bytes, Ok(ByteBuf::new()));
|
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 buf = ByteBuf::from(vec![65, 66, 67]);
|
||||||
let bytes = Deserialize::deserialize(&mut de);
|
assert_de_tokens(&buf, &[Token::Bytes(b"ABC")]);
|
||||||
assert_eq!(bytes, Ok(ByteBuf::from(vec![1, 2, 3])));
|
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,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user