summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/de.rs37
-rw-r--r--tests/test_deserialize.rs10
-rw-r--r--tests/test_serialize.rs22
3 files changed, 27 insertions, 42 deletions
diff --git a/src/de.rs b/src/de.rs
index 3da294a..0da2a82 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -117,8 +117,8 @@ impl<'a, 'b> de::Deserializer for &'b mut Deserializer<'a> {
// _serde::Deserializer::deserialize_struct(deserializer,"A", FIELDS, __Visitor)
fn deserialize_struct<V>(self,
- name: &'static str,
- fields: &'static [&'static str],
+ _name: &'static str,
+ _fields: &'static [&'static str],
visitor: V)
-> Result<V::Value, Self::Error>
where V: de::Visitor
@@ -157,29 +157,22 @@ impl<'a, 'b> de::Deserializer for &'b mut Deserializer<'a> {
}
-use std::marker::PhantomData;
use serde::de::MapVisitor;
use std::iter;
-use std::collections::hash_map::{Iter,IntoIter};
+use std::collections::hash_map::IntoIter;
#[derive(Debug)]
enum Level {
Flat(String),
Nested(String),
}
-struct FlatMapVisitor<'a, 'b>
- where 'a: 'b
+struct FlatMapVisitor
{
- de: &'b mut Deserializer<'a>,
iter: iter::Peekable<iter::Fuse<IntoIter<String, Level>>>,
- // iter: iter::Peekable<iter::Fuse<Iter<'c, String, String>>>,
-
}
-use serde::de::value::CowStrDeserializer;
-impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b>
- where 'a :'b
+impl<'a, 'b, 'c> FlatMapVisitor
{
fn new(de: &'b mut Deserializer<'a>) -> Self {
@@ -195,7 +188,6 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b>
});
debug_assert!(ldepth == rdepth);
- // a[b][c][d] = 1 => a, b], c][d]
if ldepth > 1 {
let ksplit: Vec<&str> = k.splitn(3, '[').collect();
let a = ksplit[0];
@@ -206,11 +198,9 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b>
panic!("Tried adding a nested element to a flat level");
},
Some(&Level::Nested(ref x)) => {
- // map.get(a) = x&b[c][d]=v
format!("{}&{}[{}={}", &x, &b[..b.len()-1], &c, &v).into()
},
None => {
- // map.insert(a, b[c][d]=v)
format!("{}[{}={}", &b[..b.len()-1],c, v).into()
}
};
@@ -239,21 +229,16 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b>
let x = match map.get(k.as_ref()) {
Some(_) => {
panic!("Attempted to set the value of {} twice", k);
- // map.get(a) = x&b=v
- // format!("{}&{}={}", &x, &b[..b.len()-1], &v).into()
},
None => {
v
- // map.insert(a, b=v)
- // format!("{}={}", &b[..b.len()-1], &v).into()
}
};
map.insert(k.into_owned(), Level::Flat(x.into_owned()));
}
}
- println!("Map constructed: {:?}", map);
+ // println!("Map constructed: {:?}", map);
FlatMapVisitor {
- de: de,
iter: map.into_iter().fuse().peekable(),
}
}
@@ -264,18 +249,10 @@ impl<'a, 'b, 'c> FlatMapVisitor<'a, 'b>
use serde::de::value::ValueDeserializer;
-impl<'a, 'b, 'c> de::MapVisitor for FlatMapVisitor<'a, 'b> {
+impl de::MapVisitor for FlatMapVisitor {
type Error = Error;
- // __Visitor::visit_map
- // visit_map -> visit_key::<__Field> ->
- // MapVisitor::visit_key::<__Field>()
- // -> visit_key_seed(PhantomData<__Field>)
- // -> __Field::deserialize()
- // seed.deserialize(key.into_deserializer())
- // becoes flat(seed).deserialize()
- // Swap for visit_key_seed(FlatDeserializer<__Field>)
fn visit_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
where K: de::DeserializeSeed,
{
diff --git a/tests/test_deserialize.rs b/tests/test_deserialize.rs
index 0d689d9..776d562 100644
--- a/tests/test_deserialize.rs
+++ b/tests/test_deserialize.rs
@@ -46,9 +46,17 @@ fn deserialize_struct() {
c2: 7
}
};
- let input = urlencode("b[b1]=10&b[b2]=Ten&c[c1]=Seven&c[c2]=7");
+ let input = "b[b1]=10&b[b2]=Ten&c[c1]=Seven&c[c2]=7";
+ let input2 = "c[c1]=Seven&b[b2]=Ten&b[b1]=10&c[c2]=7";
+ let result: A = serde_urlencoded::from_str(&urlencode(input)).unwrap();
+ assert_eq!(result, params);
let result: A = serde_urlencoded::from_str(&input).unwrap();
assert_eq!(result, params);
+ let result: A = serde_urlencoded::from_str(&urlencode(input2)).unwrap();
+ assert_eq!(result, params);
+ let result: A = serde_urlencoded::from_str(&input2).unwrap();
+ assert_eq!(result, params);
+
}
fn urlencode(input: &str) -> String {
diff --git a/tests/test_serialize.rs b/tests/test_serialize.rs
index 91c4d1a..75dfc61 100644
--- a/tests/test_serialize.rs
+++ b/tests/test_serialize.rs
@@ -36,27 +36,27 @@ fn serialize_map_bool() {
}
#[derive(Serialize, Deserialize)]
-struct A { b: B, c: C }
+struct Foo { bar: Bar, baz: Baz }
#[derive(Serialize, Deserialize)]
-struct B { b1: u8, b2: String }
+struct Bar { x: u8, y: String }
#[derive(Serialize, Deserialize)]
-struct C { c1: String, c2: u8 }
+struct Baz { thing: String, other: u8 }
#[test]
fn serialize_struct() {
- let params = A {
- b: B {
- b1: 10,
- b2: "Ten".to_owned()
+ let params = Foo {
+ bar: Bar {
+ x: 10,
+ y: "Ten".to_owned()
},
- c: C {
- c1: "Seven".to_owned(),
- c2: 7
+ baz: Baz {
+ thing: "Thing".to_owned(),
+ other: 12
}
};
assert_eq!(serde_urlencoded::to_string(&params),
- Ok(urlencode("b[b1]=10&b[b2]=Ten&c[c1]=Seven&c[c2]=7")));
+ Ok(urlencode("bar[x]=10&bar[y]=Ten&baz[thing]=Thing&baz[other]=12")));
}
fn urlencode(input: &str) -> String {