From 967549d85996443bee850c492e23cf40fb889ec4 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sun, 11 Sep 2016 18:49:29 +0200 Subject: Add convenience functions (fixes #2) --- src/de.rs | 39 +++++++++++++++++++++++++++++++++++++++ src/lib.rs | 4 ++-- src/ser/mod.rs | 25 ++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/de.rs b/src/de.rs index 8925f52..695547f 100644 --- a/src/de.rs +++ b/src/de.rs @@ -4,9 +4,48 @@ use serde::de; use serde::de::value::MapDeserializer; use std::borrow::Cow; use url::form_urlencoded::Parse as UrlEncodedParse; +use url::form_urlencoded::parse; pub use serde::de::value::Error; +/// Deserializes a `application/x-wwww-url-encoded` value from a `&[u8]`. +/// +/// ``` +/// let meal = vec![ +/// ("bread".to_owned(), "baguette".to_owned()), +/// ("cheese".to_owned(), "comté".to_owned()), +/// ("meat".to_owned(), "ham".to_owned()), +/// ("fat".to_owned(), "butter".to_owned()), +/// ]; +/// +/// assert_eq!( +/// serde_urlencoded::from_bytes::>( +/// b"bread=baguette&cheese=comt%C3%A9&meat=ham&fat=butter"), +/// Ok(meal)); +/// ``` +pub fn from_bytes(input: &[u8]) -> Result { + T::deserialize(&mut Deserializer::new(parse(input))) +} + +/// Deserializes a `application/x-wwww-url-encoded` value from a `&str`. +/// +/// ``` +/// let meal = vec![ +/// ("bread".to_owned(), "baguette".to_owned()), +/// ("cheese".to_owned(), "comté".to_owned()), +/// ("meat".to_owned(), "ham".to_owned()), +/// ("fat".to_owned(), "butter".to_owned()), +/// ]; +/// +/// assert_eq!( +/// serde_urlencoded::from_str::>( +/// "bread=baguette&cheese=comt%C3%A9&meat=ham&fat=butter"), +/// Ok(meal)); +/// ``` +pub fn from_str(input: &str) -> Result { + from_bytes(input.as_bytes()) +} + /// 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 95a0ad6..bacb67f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,5 +7,5 @@ extern crate url; pub mod de; pub mod ser; -pub use de::Deserializer; -pub use ser::Serializer; +pub use de::{Deserializer, from_bytes, from_str}; +pub use ser::{Serializer, to_string}; diff --git a/src/ser/mod.rs b/src/ser/mod.rs index 32c1bfd..1c030c1 100644 --- a/src/ser/mod.rs +++ b/src/ser/mod.rs @@ -12,6 +12,29 @@ use std::str; use url::form_urlencoded::Serializer as UrlEncodedSerializer; use url::form_urlencoded::Target as UrlEncodedTarget; +/// Serializes a value into a `application/x-wwww-url-encoded` `String` buffer. +/// +/// ``` +/// let meal = &[ +/// ("bread", "baguette"), +/// ("cheese", "comté"), +/// ("meat", "ham"), +/// ("fat", "butter"), +/// ]; +/// +/// assert_eq!( +/// serde_urlencoded::to_string(meal), +/// Ok("bread=baguette&cheese=comt%C3%A9&meat=ham&fat=butter".to_owned())); +/// ``` +pub fn to_string(input: &T) -> Result { + let mut output = String::new(); + { + let mut urlencoder = UrlEncodedSerializer::new(&mut output); + try!(input.serialize(&mut Serializer::new(&mut urlencoder))); + } + Ok(output) +} + /// A serializer for the `application/x-www-form-urlencoded` format. /// /// * Supported top-level inputs are structs, maps and sequences of pairs, @@ -32,7 +55,7 @@ impl<'output, T: 'output + UrlEncodedTarget> Serializer<'output, T> { } /// Errors returned during serializing to `application/x-www-form-urlencoded`. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq, Eq)] pub enum Error { Custom(Cow<'static, str>), InvalidValue(Cow<'static, str>), -- cgit v1.2.3