diff options
Diffstat (limited to 'src/ser.rs')
-rw-r--r-- | src/ser.rs | 204 |
1 files changed, 100 insertions, 104 deletions
@@ -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()) } - } - |