summaryrefslogtreecommitdiff
path: root/src/ser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ser.rs')
-rw-r--r--src/ser.rs204
1 files changed, 100 insertions, 104 deletions
diff --git a/src/ser.rs b/src/ser.rs
index cb6834f..a78d6be 100644
--- a/src/ser.rs
+++ b/src/ser.rs
@@ -2,16 +2,16 @@
//! Serialization support for querystrings.
use data_encoding::BASE64URL_NOPAD as BASE64;
-use percent_encoding::{percent_encode, EncodeSet};
+use percent_encoding::{EncodeSet, percent_encode};
use serde::ser;
+use error::*;
+
use std::borrow::Cow;
use std::fmt::Display;
use std::io::Write;
use std::str;
-use error::*;
-
#[allow(non_camel_case_types)]
#[derive(Clone)]
struct QS_ENCODE_SET;
@@ -19,8 +19,9 @@ struct QS_ENCODE_SET;
impl EncodeSet for QS_ENCODE_SET {
fn contains(&self, byte: u8) -> bool {
match byte {
- b' ' | b'*' | b'-' | b'.' | b'0' ... b'9' | b'A' ... b'Z' | b'_' | b'a' ... b'z' => false,
- _ => true
+ b' ' | b'*' | b'-' | b'.' | b'0'...b'9' | b'A'...b'Z' | b'_' |
+ b'a'...b'z' => false,
+ _ => true,
}
}
}
@@ -54,7 +55,11 @@ impl EncodeSet for QS_ENCODE_SET {
pub fn to_string<T: ser::Serialize>(input: &T) -> Result<String> {
let mut buffer = Vec::new();
let mut first = true;
- input.serialize(&mut QsSerializer { writer: &mut buffer, key: None, first: &mut first })?;
+ input.serialize(&mut QsSerializer {
+ writer: &mut buffer,
+ key: None,
+ first: &mut first,
+ })?;
String::from_utf8(buffer).map_err(Error::from)
}
@@ -83,14 +88,17 @@ fn replace_space(input: &str) -> Cow<str> {
*byte = b'+';
}
}
- Cow::Owned(String::from_utf8(replaced).expect("replacing ' ' with '+' cannot panic"))
- }
+ Cow::Owned(String::from_utf8(replaced)
+ .expect("replacing ' ' with '+' cannot panic"))
+ },
}
}
impl<'a, W: 'a + Write> QsSerializer<'a, W> {
fn extend_key(&mut self, newkey: &str) {
- let newkey = percent_encode(replace_space(newkey).as_bytes(), QS_ENCODE_SET).collect::<Cow<str>>();
+ let newkey = percent_encode(replace_space(newkey).as_bytes(),
+ QS_ENCODE_SET)
+ .collect::<Cow<str>>();
let key = if let Some(ref key) = self.key {
format!("{}[{}]", key, newkey).into()
} else {
@@ -101,11 +109,19 @@ impl<'a, W: 'a + Write> QsSerializer<'a, W> {
fn write_value(&mut self, value: &str) -> Result<()> {
if let Some(ref key) = self.key {
- write!(self.writer, "{}{}={}",
- if *self.first { *self.first = false; "" } else { "&" },
- key,
- percent_encode(value.as_bytes(), QS_ENCODE_SET).map(replace_space).collect::<String>()
- ).map_err(Error::from)
+ write!(self.writer,
+ "{}{}={}",
+ if *self.first {
+ *self.first = false;
+ ""
+ } else {
+ "&"
+ },
+ key,
+ percent_encode(value.as_bytes(), QS_ENCODE_SET)
+ .map(replace_space)
+ .collect::<String>())
+ .map_err(Error::from)
} else {
Err(Error::no_key())
}
@@ -113,8 +129,8 @@ impl<'a, W: 'a + Write> QsSerializer<'a, W> {
/// Creates a new `QsSerializer` with a distinct key, but `writer` and
///`first` referring to the original data.
- fn new_from_ref<'b: 'a>(other: &'a mut QsSerializer<'b, W>) -> QsSerializer<'a, W>
- {
+ fn new_from_ref<'b: 'a>(other: &'a mut QsSerializer<'b, W>)
+ -> QsSerializer<'a, W> {
Self {
key: other.key.clone(),
writer: other.writer,
@@ -185,9 +201,7 @@ impl<'a, W: Write> ser::Serializer for &'a mut QsSerializer<'a, W> {
}
/// Returns an error.
- fn serialize_unit_struct(self,
- name: &'static str)
- -> Result<Self::Ok> {
+ fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok> {
self.write_value(name)
}
@@ -225,25 +239,20 @@ impl<'a, W: Write> ser::Serializer for &'a mut QsSerializer<'a, W> {
Ok(())
}
- fn serialize_some<T: ?Sized + ser::Serialize>
- (self,
- value: &T)
- -> Result<Self::Ok> {
+ fn serialize_some<T: ?Sized + ser::Serialize>(self,
+ value: &T)
+ -> Result<Self::Ok> {
// Err(ErrorKind::Unsupported.into())
value.serialize(self)
}
/// Returns an error.
- fn serialize_seq(self,
- _len: Option<usize>)
- -> Result<Self::SerializeSeq> {
+ fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Ok(QsSeq(self, 0))
}
- fn serialize_tuple(self,
- _len: usize)
- -> Result<Self::SerializeTuple> {
+ fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Ok(QsSeq(self, 0))
}
@@ -255,22 +264,18 @@ impl<'a, W: Write> ser::Serializer for &'a mut QsSerializer<'a, W> {
Ok(QsSeq(self, 0))
}
- fn serialize_tuple_variant
- (self,
- _name: &'static str,
- _variant_index: u32,
- variant: &'static str,
- _len: usize)
- -> Result<Self::SerializeTupleVariant>
- {
+ fn serialize_tuple_variant(self,
+ _name: &'static str,
+ _variant_index: u32,
+ variant: &'static str,
+ _len: usize)
+ -> Result<Self::SerializeTupleVariant> {
// self.write(variant)?;
self.extend_key(variant);
Ok(QsSeq(self, 0))
}
- fn serialize_map(self,
- _len: Option<usize>)
- -> Result<Self::SerializeMap> {
+ fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Ok(QsMap(self, None))
}
@@ -281,14 +286,12 @@ impl<'a, W: Write> ser::Serializer for &'a mut QsSerializer<'a, W> {
Ok(self)
}
- fn serialize_struct_variant
- (self,
- _name: &'static str,
- _variant_index: u32,
- variant: &'static str,
- _len: usize)
- -> Result<Self::SerializeStructVariant>
- {
+ fn serialize_struct_variant(self,
+ _name: &'static str,
+ _variant_index: u32,
+ variant: &'static str,
+ _len: usize)
+ -> Result<Self::SerializeStructVariant> {
self.extend_key(variant);
Ok(self)
}
@@ -296,21 +299,23 @@ impl<'a, W: Write> ser::Serializer for &'a mut QsSerializer<'a, W> {
impl ser::Error for Error {
- fn custom<T>(msg: T) -> Self
- where T: Display {
- ErrorKind::Custom(msg.to_string()).into()
+ fn custom<T>(msg: T) -> Self
+ where T: Display,
+ {
+ ErrorKind::Custom(msg.to_string()).into()
}
}
pub struct QsSeq<'a, W: 'a + Write>(&'a mut QsSerializer<'a, W>, usize);
-pub struct QsMap<'a, W: 'a + Write>(&'a mut QsSerializer<'a, W>, Option<Cow<'a, str>>);
+pub struct QsMap<'a, W: 'a + Write>(&'a mut QsSerializer<'a, W>,
+ Option<Cow<'a, str>>);
impl<'a, W: Write> ser::SerializeTuple for QsSeq<'a, W> {
type Ok = ();
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()>
- where T: ser::Serialize
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self.0);
serializer.extend_key(&self.1.to_string());
@@ -328,7 +333,7 @@ impl<'a, W: Write> ser::SerializeSeq for QsSeq<'a, W> {
type Ok = ();
type Error = Error;
fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<()>
- where T: ser::Serialize
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self.0);
serializer.extend_key(&self.1.to_string());
@@ -341,11 +346,14 @@ impl<'a, W: Write> ser::SerializeSeq for QsSeq<'a, W> {
}
}
-impl<'a, W: Write> ser::SerializeStruct for &'a mut QsSerializer<'a, W> {
+impl<'a, W: Write> ser::SerializeStruct for &'a mut QsSerializer<'a, W> {
type Ok = ();
type Error = Error;
- fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<()>
- where T: ser::Serialize
+ fn serialize_field<T: ?Sized>(&mut self,
+ key: &'static str,
+ value: &T)
+ -> Result<()>
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self);
serializer.extend_key(key);
@@ -360,8 +368,11 @@ impl<'a, W: Write> ser::SerializeStructVariant for &'a mut QsSerializer<'a, W> {
type Ok = ();
type Error = Error;
- fn serialize_field<T: ?Sized>(&mut self, key: &'static str, value: &T) -> Result<()>
- where T: ser::Serialize
+ fn serialize_field<T: ?Sized>(&mut self,
+ key: &'static str,
+ value: &T)
+ -> Result<()>
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self);
serializer.extend_key(key);
@@ -371,7 +382,6 @@ impl<'a, W: Write> ser::SerializeStructVariant for &'a mut QsSerializer<'a, W> {
fn end(self) -> Result<Self::Ok> {
Ok(())
}
-
}
impl<'a, W: Write> ser::SerializeTupleVariant for QsSeq<'a, W> {
@@ -379,7 +389,7 @@ impl<'a, W: Write> ser::SerializeTupleVariant for QsSeq<'a, W> {
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()>
- where T: ser::Serialize
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self.0);
serializer.extend_key(&self.1.to_string());
@@ -390,7 +400,6 @@ impl<'a, W: Write> ser::SerializeTupleVariant for QsSeq<'a, W> {
fn end(self) -> Result<Self::Ok> {
Ok(())
}
-
}
impl<'a, W: Write> ser::SerializeTupleStruct for QsSeq<'a, W> {
@@ -398,7 +407,7 @@ impl<'a, W: Write> ser::SerializeTupleStruct for QsSeq<'a, W> {
type Error = Error;
fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<()>
- where T: ser::Serialize
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self.0);
serializer.extend_key(&self.1.to_string());
@@ -409,7 +418,6 @@ impl<'a, W: Write> ser::SerializeTupleStruct for QsSeq<'a, W> {
fn end(self) -> Result<Self::Ok> {
Ok(())
}
-
}
impl<'a, W: Write> ser::SerializeMap for QsMap<'a, W> {
@@ -417,14 +425,14 @@ impl<'a, W: Write> ser::SerializeMap for QsMap<'a, W> {
type Error = Error;
fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<()>
- where T: ser::Serialize
+ where T: ser::Serialize,
{
self.1 = Some(Cow::from(key.serialize(StringSerializer)?));
Ok(())
}
fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<()>
- where T: ser::Serialize
+ where T: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self.0);
if let Some(ref key) = self.1 {
@@ -440,14 +448,17 @@ impl<'a, W: Write> ser::SerializeMap for QsMap<'a, W> {
Ok(())
}
- fn serialize_entry<K: ?Sized, V: ?Sized>(&mut self, key: &K, value: &V) -> Result<()>
- where K: ser::Serialize, V: ser::Serialize,
+ fn serialize_entry<K: ?Sized, V: ?Sized>(&mut self,
+ key: &K,
+ value: &V)
+ -> Result<()>
+ where K: ser::Serialize,
+ V: ser::Serialize,
{
let mut serializer = QsSerializer::new_from_ref(self.0);
serializer.extend_key(&key.serialize(StringSerializer)?);
value.serialize(&mut serializer)
}
-
}
struct StringSerializer;
@@ -490,9 +501,7 @@ impl ser::Serializer for StringSerializer {
}
/// Returns an error.
- fn serialize_unit_struct(self,
- _name: &'static str)
- -> Result<Self::Ok> {
+ fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
Err(ErrorKind::Unsupported.into())
}
@@ -519,7 +528,7 @@ impl ser::Serializer for StringSerializer {
(self,
_name: &'static str,
_variant_index: u32,
- _variant: &'static str,
+ _variant: &'static str,
_value: &T)
-> Result<Self::Ok> {
Err(ErrorKind::Unsupported.into())
@@ -531,24 +540,19 @@ impl ser::Serializer for StringSerializer {
}
/// Returns an error.
- fn serialize_some<T: ?Sized + ser::Serialize>
- (self,
- _value: &T)
- -> Result<Self::Ok> {
+ fn serialize_some<T: ?Sized + ser::Serialize>(self,
+ _value: &T)
+ -> Result<Self::Ok> {
Err(ErrorKind::Unsupported.into())
}
/// Returns an error.
- fn serialize_seq(self,
- _len: Option<usize>)
- -> Result<Self::SerializeSeq> {
+ fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
Err(ErrorKind::Unsupported.into())
}
- fn serialize_tuple(self,
- _len: usize)
- -> Result<Self::SerializeTuple> {
+ fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
Err(ErrorKind::Unsupported.into())
}
@@ -560,20 +564,16 @@ impl ser::Serializer for StringSerializer {
Err(ErrorKind::Unsupported.into())
}
- fn serialize_tuple_variant
- (self,
- _name: &'static str,
- _variant_index: u32,
- _variant: &'static str,
- _len: usize)
- -> Result<Self::SerializeTupleVariant>
- {
+ fn serialize_tuple_variant(self,
+ _name: &'static str,
+ _variant_index: u32,
+ _variant: &'static str,
+ _len: usize)
+ -> Result<Self::SerializeTupleVariant> {
Err(ErrorKind::Unsupported.into())
}
- fn serialize_map(self,
- _len: Option<usize>)
- -> Result<Self::SerializeMap> {
+ fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
Err(ErrorKind::Unsupported.into())
}
@@ -585,16 +585,12 @@ impl ser::Serializer for StringSerializer {
Err(ErrorKind::Unsupported.into())
}
- fn serialize_struct_variant
- (self,
- _name: &'static str,
- _variant_index: u32,
- _variant: &'static str,
- _len: usize)
- -> Result<Self::SerializeStructVariant>
- {
+ fn serialize_struct_variant(self,
+ _name: &'static str,
+ _variant_index: u32,
+ _variant: &'static str,
+ _len: usize)
+ -> Result<Self::SerializeStructVariant> {
Err(ErrorKind::Unsupported.into())
}
-
}
-