diff options
-rw-r--r-- | src/de.rs | 14 | ||||
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | tests/test_deserialize.rs | 25 |
3 files changed, 40 insertions, 1 deletions
@@ -4,6 +4,7 @@ use serde::de; pub use serde::de::value::Error; use serde::de::value::MapDeserializer; +use std::io::Read; use url::form_urlencoded::Parse as UrlEncodedParse; 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()) } +/// 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. /// /// * Supported top-level outputs are structs, maps and sequences of pairs, @@ -11,5 +11,5 @@ extern crate url; pub mod de; 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}; diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs new file mode 100644 index 0000000..eeb2ce6 --- /dev/null +++ b/tests/test_deserialize.rs @@ -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)); +} |