12: implement deserialization of std::io::Read
This commit is contained in:
bors-ng[bot] 2017-02-05 13:36:49 +00:00
commit 9931bc5318
3 changed files with 40 additions and 1 deletions

View File

@ -4,6 +4,7 @@ use serde::de;
pub use serde::de::value::Error; pub use serde::de::value::Error;
use serde::de::value::MapDeserializer; use serde::de::value::MapDeserializer;
use std::io::Read;
use url::form_urlencoded::Parse as UrlEncodedParse; use url::form_urlencoded::Parse as UrlEncodedParse;
use url::form_urlencoded::parse; use url::form_urlencoded::parse;
@ -45,6 +46,19 @@ pub fn from_str<T: de::Deserialize>(input: &str) -> Result<T, Error> {
from_bytes(input.as_bytes()) from_bytes(input.as_bytes())
} }
/// Convenience function that reads all bytes from `reader` and deserializes
/// them with `from_bytes`.
pub fn from_reader<T, R>(mut reader: R) -> Result<T, Error>
where T: de::Deserialize, R: Read
{
let mut buf = vec![];
reader.read_to_end(&mut buf)
.map_err(|e| {
de::Error::custom(format_args!("could not read input: {}", e))
})?;
from_bytes(&buf)
}
/// A deserializer for the `application/x-www-form-urlencoded` format. /// A deserializer for the `application/x-www-form-urlencoded` format.
/// ///
/// * Supported top-level outputs are structs, maps and sequences of pairs, /// * Supported top-level outputs are structs, maps and sequences of pairs,

View File

@ -11,5 +11,5 @@ extern crate url;
pub mod de; pub mod de;
pub mod ser; pub mod ser;
pub use de::{Deserializer, from_bytes, from_str}; pub use de::{Deserializer, from_bytes, from_str, from_reader};
pub use ser::{Serializer, to_string}; pub use ser::{Serializer, to_string};

25
tests/test_deserialize.rs Normal file
View File

@ -0,0 +1,25 @@
extern crate serde_urlencoded;
#[test]
fn deserialize_bytes() {
let result = vec![("first".to_owned(), 23), ("last".to_owned(), 42)];
assert_eq!(serde_urlencoded::from_bytes(b"first=23&last=42"),
Ok(result));
}
#[test]
fn deserialize_str() {
let result = vec![("first".to_owned(), 23), ("last".to_owned(), 42)];
assert_eq!(serde_urlencoded::from_str("first=23&last=42"),
Ok(result));
}
#[test]
fn deserialize_reader() {
let result = vec![("first".to_owned(), 23), ("last".to_owned(), 42)];
assert_eq!(serde_urlencoded::from_reader(b"first=23&last=42" as &[_]),
Ok(result));
}