summaryrefslogtreecommitdiff
path: root/src/ser/value.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ser/value.rs')
-rw-r--r--src/ser/value.rs30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/ser/value.rs b/src/ser/value.rs
index 56b410e..832cbf3 100644
--- a/src/ser/value.rs
+++ b/src/ser/value.rs
@@ -1,6 +1,6 @@
use ser::Error;
use ser::part::{PartSerializer, Sink};
-use serde::ser::{Serialize, SerializeStruct};
+use serde::ser::{Serialize, SerializeSeq, SerializeStruct};
use std::str;
use url::form_urlencoded::Serializer as UrlEncodedSerializer;
use url::form_urlencoded::Target as UrlEncodedTarget;
@@ -10,6 +10,7 @@ pub struct ValueSink<'key, 'target, Target>
{
urlencoder: &'target mut UrlEncodedSerializer<Target>,
key: &'key str,
+ idx: usize,
}
impl<'key, 'target, Target> ValueSink<'key, 'target, Target>
@@ -21,11 +22,12 @@ impl<'key, 'target, Target> ValueSink<'key, 'target, Target>
ValueSink {
urlencoder: urlencoder,
key: key,
+ idx: 0,
}
}
}
-impl<'key, 'target, Target> Sink for ValueSink<'key, 'target, Target>
+impl<'key, 'target, Target> Sink<(), Error> for ValueSink<'key, 'target, Target>
where Target: 'target + UrlEncodedTarget,
{
// type Ok = ();
@@ -43,13 +45,13 @@ impl<'key, 'target, Target> Sink for ValueSink<'key, 'target, Target>
self.serialize_str(&value)
}
- fn serialize_none(self) -> Result<Self::Ok, Error> {
+ fn serialize_none(self) -> Result<(), Error> {
Ok(())
}
fn serialize_some<T: ?Sized + Serialize>(self,
value: &T)
- -> Result<Self::Ok, Error> {
+ -> Result<(), Error> {
value.serialize(PartSerializer::new(self))
}
@@ -79,3 +81,23 @@ impl<'key, 'target, Target> SerializeStruct for ValueSink<'key, 'target, Target>
}
}
+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(())
+ }
+}
+