diff options
Diffstat (limited to 'src/ser')
-rw-r--r-- | src/ser/key.rs | 108 | ||||
-rw-r--r-- | src/ser/mod.rs | 519 | ||||
-rw-r--r-- | src/ser/part.rs | 232 | ||||
-rw-r--r-- | src/ser/value.rs | 102 |
4 files changed, 0 insertions, 961 deletions
diff --git a/src/ser/key.rs b/src/ser/key.rs deleted file mode 100644 index 10f1fff..0000000 --- a/src/ser/key.rs +++ /dev/null @@ -1,108 +0,0 @@ -use ser::Error; -use ser::part::Sink; -use serde::Serialize; -use serde::ser::{SerializeSeq, SerializeStruct}; -use std::borrow::Cow; -use std::ops::Deref; - -pub enum Key<'key> { - Static(&'static str), - Dynamic(Cow<'key, str>), -} - -impl<'key> Deref for Key<'key> { - type Target = str; - - fn deref(&self) -> &str { - match *self { - Key::Static(key) => key, - Key::Dynamic(ref key) => key, - } - } -} - -impl<'key> From<Key<'key>> for Cow<'static, str> { - fn from(key: Key<'key>) -> Self { - match key { - Key::Static(key) => key.into(), - Key::Dynamic(key) => key.into_owned().into(), - } - } -} - -pub struct KeySink<End> { - end: End, -} - -impl<End, Ok> KeySink<End> - where End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>, -{ - pub fn new(end: End) -> Self { - KeySink { end: end } - } -} - -impl<End, Ok> Sink<Ok, Error> for KeySink<End> - where End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>, -{ - fn serialize_static_str(self, value: &'static str) -> Result<Ok, Error> { - (self.end)(Key::Static(value)) - } - - fn serialize_str(self, value: &str) -> Result<Ok, Error> { - (self.end)(Key::Dynamic(value.into())) - } - - fn serialize_string(self, value: String) -> Result<Ok, Error> { - (self.end)(Key::Dynamic(value.into())) - } - - fn serialize_none(self) -> Result<Ok, Error> { - Err(self.unsupported()) - } - - fn serialize_some<T: ?Sized + Serialize>(self, - _value: &T) - -> Result<Ok, Error> { - Err(self.unsupported()) - } - - fn unsupported(&self) -> Error { - Error::Custom("unsupported key".into()) - } -} - -impl<End, Ok> SerializeStruct for KeySink<End> - where End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>, -{ - type Ok = Ok; - type Error = Error; - - fn serialize_field<T: ?Sized + Serialize>(&mut self, - _key: &'static str, - _value: &T) - -> Result<(), Error> { - Err(self.unsupported()) - } - - fn end(self) -> Result<Self::Ok, Error> { - Err(self.unsupported()) - } -} - -impl<End, Ok> SerializeSeq for KeySink<End> - where End: for<'key> FnOnce(Key<'key>) -> Result<Ok, Error>, -{ - type Ok = Ok; - type Error = Error; - - fn serialize_element<T: ?Sized + Serialize>(&mut self, - _value: &T) - -> Result<(), Error> { - Err(self.unsupported()) - } - - fn end(self) -> Result<Self::Ok, Error> { - Err(self.unsupported()) - } -} diff --git a/src/ser/mod.rs b/src/ser/mod.rs deleted file mode 100644 index df35995..0000000 --- a/src/ser/mod.rs +++ /dev/null @@ -1,519 +0,0 @@ -//! Serialization support for querystrings. - -mod key; -mod part; -mod value; - -use serde::ser; -use std::borrow::Cow; -use std::error; -use std::fmt; -use std::str; -use url::form_urlencoded::Serializer as UrlEncodedSerializer; -use url::form_urlencoded::Target as UrlEncodedTarget; - -/// Serializes a value into a querystring. -/// -/// ``` -/// # #[macro_use] -/// # extern crate serde_derive; -/// # extern crate serde_qs; -/// #[derive(Deserialize, Serialize)] -/// struct Query { -/// name: String, -/// age: u8, -/// occupation: String, -/// } -/// -/// # fn main(){ -/// let q = Query { -/// name: "Alice".to_owned(), -/// age: 24, -/// occupation: "Student".to_owned(), -/// }; -/// -/// -/// assert_eq!( -/// serde_qs::to_string(&q), -/// Ok("name=Alice&age=24&occupation=Student".to_owned())); -/// # } -/// ``` -pub fn to_string<T: ser::Serialize>(input: &T) -> Result<String, Error> { - let mut urlencoder = UrlEncodedSerializer::new("".to_owned()); - input.serialize(Serializer::new(&mut urlencoder))?; - Ok(urlencoder.finish()) -} - -/// A serializer for the querystring format. -/// -/// * Supported top-level inputs are structs and maps. -/// -/// * Supported values are currently most primitive types, structs, maps and -/// sequences. Sequences are serialized with an incrementing key index. -/// -/// * Newtype structs defer to their inner values. -pub struct Serializer<'output, Target: 'output + UrlEncodedTarget> { - urlencoder: &'output mut UrlEncodedSerializer<Target>, -} - -impl<'output, Target: 'output + UrlEncodedTarget> Serializer<'output, Target> { - /// Returns a new `Serializer`. - pub fn new(urlencoder: &'output mut UrlEncodedSerializer<Target>) -> Self { - Serializer { urlencoder: urlencoder } - } -} - -/// Errors returned during serializing to querystring. -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum Error { - Custom(Cow<'static, str>), - Utf8(str::Utf8Error), -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match *self { - Error::Custom(ref msg) => msg.fmt(f), - Error::Utf8(ref err) => write!(f, "invalid UTF-8: {}", err), - } - } -} - -impl error::Error for Error { - fn description(&self) -> &str { - match *self { - Error::Custom(ref msg) => msg, - Error::Utf8(ref err) => error::Error::description(err), - } - } - - /// The lower-level cause of this error, in the case of a `Utf8` error. - fn cause(&self) -> Option<&error::Error> { - match *self { - Error::Custom(_) => None, - Error::Utf8(ref err) => Some(err), - } - } -} - -impl ser::Error for Error { - fn custom<T: fmt::Display>(msg: T) -> Self { - Error::Custom(format!("{}", msg).into()) - } -} - -/// Sequence serializer. -pub struct SeqSerializer<'output, T: 'output + UrlEncodedTarget> { - inner: ser::Impossible<&'output mut UrlEncodedSerializer<T>, Error>, -} - -/// Tuple serializer. -/// -/// Never instantiated, tuples are not supported at top-level. -pub struct TupleSerializer<'output, T: 'output + UrlEncodedTarget> { - inner: ser::Impossible<&'output mut UrlEncodedSerializer<T>, Error>, -} - -/// Tuple struct serializer. -/// -/// Never instantiated, tuple structs are not supported. -pub struct TupleStructSerializer<'output, T: 'output + UrlEncodedTarget> { - inner: ser::Impossible<&'output mut UrlEncodedSerializer<T>, Error>, -} - -/// Tuple variant serializer. -/// -/// Never instantiated, tuple variants are not supported. -pub struct TupleVariantSerializer<'output, T: 'output + UrlEncodedTarget> { - inner: ser::Impossible<&'output mut UrlEncodedSerializer<T>, Error>, -} - -/// Map serializer. -pub struct MapSerializer<'output, Target: 'output + UrlEncodedTarget> { - urlencoder: &'output mut UrlEncodedSerializer<Target>, - key: Option<Cow<'static, str>>, -} - -/// Struct serializer. -pub struct StructSerializer<'output, Target: 'output + UrlEncodedTarget> { - urlencoder: &'output mut UrlEncodedSerializer<Target>, -} - -/// Struct variant serializer. -/// -/// Never instantiated, struct variants are not supported. -pub struct StructVariantSerializer<'output, T: 'output + UrlEncodedTarget> { - inner: ser::Impossible<&'output mut UrlEncodedSerializer<T>, Error>, -} - -impl<'output, Target> ser::Serializer for Serializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - type SerializeSeq = SeqSerializer<'output, Target>; - type SerializeTuple = TupleSerializer<'output, Target>; - type SerializeTupleStruct = TupleStructSerializer<'output, Target>; - type SerializeTupleVariant = TupleVariantSerializer<'output, Target>; - type SerializeMap = MapSerializer<'output, Target>; - type SerializeStruct = StructSerializer<'output, Target>; - type SerializeStructVariant = StructVariantSerializer<'output, Target>; - - /// Returns an error. - fn serialize_bool(self, _v: bool) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_i8(self, _v: i8) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_u8(self, _v: u8) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_u16(self, _v: u16) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_u32(self, _v: u32) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_u64(self, _v: u64) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_char(self, _v: char) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_str(self, _value: &str) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_unit(self) -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_unit_struct(self, - _name: &'static str) - -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_unit_variant(self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str) - -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Serializes the inner value, ignoring the newtype name. - fn serialize_newtype_struct<T: ?Sized + ser::Serialize> - (self, - _name: &'static str, - value: &T) - -> Result<Self::Ok, Error> { - value.serialize(self) - } - - /// Returns an error. - fn serialize_newtype_variant<T: ?Sized + ser::Serialize> - (self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str, - _value: &T) - -> Result<Self::Ok, Error> { - Err(Error::top_level()) - } - - /// Returns `Ok`. - fn serialize_none(self) -> Result<Self::Ok, Error> { - Ok(self.urlencoder) - } - - /// Serializes the given value. - fn serialize_some<T: ?Sized + ser::Serialize> - (self, - value: &T) - -> Result<Self::Ok, Error> { - value.serialize(self) - } - - /// Serialize a sequence, given length (if any) is ignored. - fn serialize_seq(self, - _len: Option<usize>) - -> Result<Self::SerializeSeq, Error> { - Err(Error::top_level()) - } - - - /// Returns an error. - fn serialize_tuple(self, - _len: usize) - -> Result<Self::SerializeTuple, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_tuple_struct(self, - _name: &'static str, - _len: usize) - -> Result<Self::SerializeTupleStruct, Error> { - Err(Error::top_level()) - } - - /// Returns an error. - fn serialize_tuple_variant - (self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str, - _len: usize) - -> Result<Self::SerializeTupleVariant, Error> { - Err(Error::top_level()) - } - - /// Serializes a map, given length is ignored. - fn serialize_map(self, - _len: Option<usize>) - -> Result<Self::SerializeMap, Error> { - Ok(MapSerializer { - urlencoder: self.urlencoder, - key: None, - }) - } - - /// Serializes a struct, given length is ignored. - fn serialize_struct(self, - _name: &'static str, - _len: usize) - -> Result<Self::SerializeStruct, Error> { - Ok(StructSerializer { urlencoder: self.urlencoder }) - } - - /// Returns an error. - fn serialize_struct_variant - (self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str, - _len: usize) - -> Result<Self::SerializeStructVariant, Error> { - Err(Error::top_level()) - } -} - -impl<'output, Target> ser::SerializeSeq for SeqSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_element<T: ?Sized + ser::Serialize>(&mut self, - value: &T) - -> Result<(), Error> { - self.inner.serialize_element(value) - } - - fn end(self) -> Result<Self::Ok, Error> { - self.inner.end() - } -} - - -impl<'output, Target> ser::SerializeTuple for TupleSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_element<T: ?Sized + ser::Serialize>(&mut self, - value: &T) - -> Result<(), Error> { - self.inner.serialize_element(value) - } - - fn end(self) -> Result<Self::Ok, Error> { - self.inner.end() - } -} - -impl<'output, Target> ser::SerializeTupleStruct - for - TupleStructSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_field<T: ?Sized + ser::Serialize>(&mut self, - value: &T) - -> Result<(), Error> { - self.inner.serialize_field(value) - } - - fn end(self) -> Result<Self::Ok, Error> { - self.inner.end() - } -} - -impl<'output, Target> ser::SerializeTupleVariant - for - TupleVariantSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_field<T: ?Sized + ser::Serialize>(&mut self, - value: &T) - -> Result<(), Error> { - self.inner.serialize_field(value) - } - - fn end(self) -> Result<Self::Ok, Error> { - self.inner.end() - } -} - -impl<'output, Target> ser::SerializeMap for MapSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_entry<K: ?Sized + ser::Serialize, V: ?Sized + ser::Serialize> - (&mut self, - key: &K, - value: &V) - -> Result<(), Error> { - let key_sink = key::KeySink::new(|key| { - let value_sink = value::ValueSink::new(self.urlencoder, &key); - value.serialize(part::PartSerializer::new(value_sink))?; - self.key = None; - Ok(()) - }); - let entry_serializer = part::PartSerializer::new(key_sink); - key.serialize(entry_serializer) - } - - fn serialize_key<T: ?Sized + ser::Serialize>(&mut self, - key: &T) - -> Result<(), Error> { - let key_sink = key::KeySink::new(|key| Ok(key.into())); - let key_serializer = part::PartSerializer::new(key_sink); - self.key = Some(key.serialize(key_serializer)?); - Ok(()) - } - - fn serialize_value<T: ?Sized + ser::Serialize>(&mut self, - value: &T) - -> Result<(), Error> { - { - let key = self.key.as_ref().ok_or_else(Error::no_key)?; - let value_sink = value::ValueSink::new(self.urlencoder, key); - value.serialize(part::PartSerializer::new(value_sink))?; - } - self.key = None; - Ok(()) - } - - fn end(self) -> Result<Self::Ok, Error> { - Ok(self.urlencoder) - } -} - -impl<'output, Target> ser::SerializeStruct for StructSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_field<T: ?Sized + ser::Serialize>(&mut self, - key: &'static str, - value: &T) - -> Result<(), Error> { - let value_sink = value::ValueSink::new(self.urlencoder, key); - value.serialize(part::PartSerializer::new(value_sink)) - } - - fn end(self) -> Result<Self::Ok, Error> { - Ok(self.urlencoder) - } -} - -impl<'output, Target> ser::SerializeStructVariant - for - StructVariantSerializer<'output, Target> - where Target: 'output + UrlEncodedTarget, -{ - type Ok = &'output mut UrlEncodedSerializer<Target>; - type Error = Error; - - fn serialize_field<T: ?Sized + ser::Serialize>(&mut self, - key: &'static str, - value: &T) - -> Result<(), Error> { - self.inner.serialize_field(key, value) - } - - fn end(self) -> Result<Self::Ok, Error> { - self.inner.end() - } -} - -impl Error { - fn top_level() -> Self { - let msg = "top-level serializer supports only maps and structs"; - Error::Custom(msg.into()) - } - - fn no_key() -> Self { - let msg = "tried to serialize a value before serializing key"; - Error::Custom(msg.into()) - } -} diff --git a/src/ser/part.rs b/src/ser/part.rs deleted file mode 100644 index ad2d9dd..0000000 --- a/src/ser/part.rs +++ /dev/null @@ -1,232 +0,0 @@ -use dtoa; -use itoa; -use ser::Error; -use serde; -use serde::ser; -use std::marker::PhantomData; -use std::str; - -pub struct PartSerializer<SO, S: Sink<SO, Error>> { - sink: S, - marker: PhantomData<SO>, -} - -impl<SO, S: Sink<SO, Error>> PartSerializer<SO, S> { - pub fn new(sink: S) -> Self { - PartSerializer { - sink: sink, - marker: PhantomData, - } - } -} - -pub trait Sink<S, E>: Sized + ser::SerializeStruct<Ok=S, Error=E> - + ser::SerializeSeq<Ok=S, Error=E> - where E: serde::ser::Error -{ -// type Ok; -// type Error; - fn serialize_static_str(self, - value: &'static str) - -> Result<S, Error>; - - fn serialize_str(self, value: &str) -> Result<S, Error>; - fn serialize_string(self, value: String) -> Result<S, Error>; - fn serialize_none(self) -> Result<S, Error>; - - fn serialize_some<T: ?Sized + ser::Serialize> - (self, - value: &T) - -> Result<S, Error>; - - fn unsupported(&self) -> Error; -} - -impl<SO, S: Sink<SO, Error>> ser::Serializer for PartSerializer<SO, S> { - type Ok = SO; - type Error = Error; - type SerializeSeq = S; - type SerializeTuple = ser::Impossible<SO, Error>; - type SerializeTupleStruct = ser::Impossible<SO, Error>; - type SerializeTupleVariant = ser::Impossible<SO, Error>; - type SerializeMap = ser::Impossible<SO, Error>; - type SerializeStruct = S; - type SerializeStructVariant = ser::Impossible<SO, Error>; - - fn serialize_bool(self, v: bool) -> Result<SO, Error> { - self.sink.serialize_static_str(if v { "true" } else { "false" }) - } - - fn serialize_i8(self, v: i8) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_i16(self, v: i16) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_i32(self, v: i32) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_i64(self, v: i64) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_u8(self, v: u8) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_u16(self, v: u16) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_u32(self, v: u32) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_u64(self, v: u64) -> Result<SO, Error> { - self.serialize_integer(v) - } - - fn serialize_f32(self, v: f32) -> Result<SO, Error> { - self.serialize_floating(v) - } - - fn serialize_f64(self, v: f64) -> Result<SO, Error> { - self.serialize_floating(v) - } - - fn serialize_char(self, v: char) -> Result<SO, Error> { - self.sink.serialize_string(v.to_string()) - } - - fn serialize_str(self, value: &str) -> Result<SO, Error> { - self.sink.serialize_str(value) - } - - fn serialize_bytes(self, value: &[u8]) -> Result<SO, Error> { - match str::from_utf8(value) { - Ok(value) => self.sink.serialize_str(value), - Err(err) => Err(Error::Utf8(err)), - } - } - - fn serialize_unit(self) -> Result<SO, Error> { - Err(self.sink.unsupported()) - } - - fn serialize_unit_struct(self, name: &'static str) -> Result<SO, Error> { - self.sink.serialize_static_str(name.into()) - } - - fn serialize_unit_variant(self, - _name: &'static str, - _variant_index: u32, - variant: &'static str) - -> Result<SO, Error> { - self.sink.serialize_static_str(variant.into()) - } - - fn serialize_newtype_struct<T: ?Sized + ser::Serialize> - (self, - _name: &'static str, - value: &T) - -> Result<SO, Error> { - value.serialize(self) - } - - fn serialize_newtype_variant<T: ?Sized + ser::Serialize> - (self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str, - _value: &T) - -> Result<SO, Error> { - Err(self.sink.unsupported()) - } - - fn serialize_none(self) -> Result<SO, Error> { - self.sink.serialize_none() - } - - fn serialize_some<T: ?Sized + ser::Serialize>(self, - value: &T) - -> Result<SO, Error> { - self.sink.serialize_some(value) - } - - fn serialize_seq(self, - _len: Option<usize>) - -> Result<Self::SerializeSeq, Error> { - Ok(self.sink) - } - - fn serialize_tuple(self, - _len: usize) - -> Result<Self::SerializeTuple, Error> { - Err(self.sink.unsupported()) - } - - fn serialize_tuple_struct(self, - _name: &'static str, - _len: usize) - -> Result<Self::SerializeTuple, Error> { - Err(self.sink.unsupported()) - } - - fn serialize_tuple_variant - (self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str, - _len: usize) - -> Result<Self::SerializeTupleVariant, Error> { - Err(self.sink.unsupported()) - } - - fn serialize_map(self, - _len: Option<usize>) - -> Result<Self::SerializeMap, Error> { - Err(self.sink.unsupported()) - } - - fn serialize_struct(self, - _name: &'static str, - _len: usize) - -> Result<Self::SerializeStruct, Error> { - // Err(self.sink.unsupported()) - Ok(self.sink) - - } - - fn serialize_struct_variant - (self, - _name: &'static str, - _variant_index: u32, - _variant: &'static str, - _len: usize) - -> Result<Self::SerializeStructVariant, Error> { - Err(self.sink.unsupported()) - } -} - -impl<SO, S: Sink<SO, Error>> PartSerializer<SO, S> { - fn serialize_integer<I>(self, value: I) -> Result<SO, Error> - where I: itoa::Integer, - { - let mut buf = [b'\0'; 20]; - let len = itoa::write(&mut buf[..], value).unwrap(); - let part = unsafe { str::from_utf8_unchecked(&buf[0..len]) }; - ser::Serializer::serialize_str(self, part) - } - - fn serialize_floating<F>(self, value: F) -> Result<SO, Error> - where F: dtoa::Floating, - { - let mut buf = [b'\0'; 24]; - let len = dtoa::write(&mut buf[..], value).unwrap(); - let part = unsafe { str::from_utf8_unchecked(&buf[0..len]) }; - ser::Serializer::serialize_str(self, part) - } -} diff --git a/src/ser/value.rs b/src/ser/value.rs deleted file mode 100644 index f2fc617..0000000 --- a/src/ser/value.rs +++ /dev/null @@ -1,102 +0,0 @@ -use ser::Error; -use ser::part::{PartSerializer, Sink}; -use serde::ser::{Serialize, SerializeSeq, SerializeStruct}; -use std::str; -use url::form_urlencoded::Serializer as UrlEncodedSerializer; -use url::form_urlencoded::Target as UrlEncodedTarget; - -pub struct ValueSink<'key, 'target, Target> - where Target: 'target + UrlEncodedTarget, -{ - urlencoder: &'target mut UrlEncodedSerializer<Target>, - key: &'key str, - idx: usize, -} - -impl<'key, 'target, Target> ValueSink<'key, 'target, Target> - where Target: 'target + UrlEncodedTarget, -{ - pub fn new(urlencoder: &'target mut UrlEncodedSerializer<Target>, - key: &'key str) - -> Self { - ValueSink { - urlencoder: urlencoder, - key: key, - idx: 0, - } - } -} - -impl<'key, 'target, Target> Sink<(), Error> for ValueSink<'key, 'target, Target> - where Target: 'target + UrlEncodedTarget, -{ - // type Ok = (); - - fn serialize_str(self, value: &str) -> Result<(), Error> { - self.urlencoder.append_pair(self.key, value); - Ok(()) - } - - fn serialize_static_str(self, value: &'static str) -> Result<(), Error> { - self.serialize_str(value) - } - - fn serialize_string(self, value: String) -> Result<(), Error> { - self.serialize_str(&value) - } - - fn serialize_none(self) -> Result<(), Error> { - Ok(()) - } - - fn serialize_some<T: ?Sized + Serialize>(self, - value: &T) - -> Result<(), Error> { - value.serialize(PartSerializer::new(self)) - } - - fn unsupported(&self) -> Error { - Error::Custom("unsupported value".into()) - } -} - - -impl<'key, 'target, Target> SerializeStruct for ValueSink<'key, 'target, Target> - where Target: 'target + UrlEncodedTarget, -{ - type Ok = (); - type Error = Error; - - fn serialize_field<T: ?Sized + Serialize>(&mut self, - key: &'static str, - value: &T) - -> Result<(), Error> { - let newk = format!("{}[{}]", self.key, key); - let value_sink = ValueSink::new(self.urlencoder, &newk); - value.serialize(super::part::PartSerializer::new(value_sink)) - } - - fn end(self) -> Result<Self::Ok, Error> { - Ok(()) - } -} - -impl<'key, 'target, Target> SerializeSeq for ValueSink<'key, 'target, Target> - where Target: 'target + UrlEncodedTarget, -{ - type Ok = (); - type Error = Error; - - fn serialize_element<T: ?Sized + Serialize>(&mut self, - value: &T) - -> Result<(), Error> { - let newk = format!("{}[{}]", self.key, self.idx); - self.idx += 1; - let value_sink = ValueSink::new(self.urlencoder, &newk); - value.serialize(super::part::PartSerializer::new(value_sink)) - } - - fn end(self) -> Result<Self::Ok, Error> { - Ok(()) - } -} |