summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/de.rs14
-rw-r--r--src/lib.rs2
-rw-r--r--tests/test_deserialize.rs25
3 files changed, 40 insertions, 1 deletions
diff --git a/src/de.rs b/src/de.rs
index 95208e9..95999d0 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -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,
diff --git a/src/lib.rs b/src/lib.rs
index 285a091..db5f3a7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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));
+}