Skip to content

Commit 66c79af

Browse files
authored
Merge pull request #45 from snipsco/master
Improved enum support, fixes on serde tests
2 parents 55dad37 + 51e9fbb commit 66c79af

File tree

6 files changed

+105
-20
lines changed

6 files changed

+105
-20
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ env:
66
script:
77
- cargo build -v
88
- cargo test -v
9+
- cd serde-tests && cargo test -v

serde-tests/Cargo.toml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ build = "build.rs"
66

77

88
[dependencies]
9-
serde = "0.7"
9+
serde = "0.8"
1010
bson = { path = "..", features = ["serde"] }
1111

1212
[build-dependencies]
13-
syntex = "^0.29.0"
14-
serde_codegen = "0.7"
13+
syntex = "0.46"
14+
serde_codegen = "0.8"
1515

1616
[lib]
1717
name = "serde_tests"
1818
path = "lib.rs"
1919

2020
[[test]]
2121
name = "serde"
22-
path = "test.rs"
22+
path = "test.rs"

serde-tests/build.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,5 @@ fn main() {
1010
let src = Path::new("test.rs.in");
1111
let dst = Path::new(&out_dir).join("test.rs");
1212

13-
let mut registry = syntex::Registry::new();
14-
15-
serde_codegen::register(&mut registry);
16-
registry.expand("", &src, &dst).unwrap();
13+
serde_codegen::expand(&src,&dst).unwrap();
1714
}

serde-tests/test.rs.in

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ fn inner_structs_with_options() {
188188
assert_eq!(encode!(v),
189189
bdoc! {
190190
"a" => {
191+
"a" => (Bson::Null),
191192
"b" => {
192193
"a" => "foo",
193194
"b" => (4.5)
@@ -201,6 +202,43 @@ fn inner_structs_with_options() {
201202
assert_eq!(v, decode!(encode!(v)));
202203
}
203204

205+
#[test]
206+
fn inner_structs_with_skippable_options() {
207+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
208+
struct Foo {
209+
#[serde(skip_serializing_if="Option::is_none")]
210+
a: Option<Box<Foo>>,
211+
b: Bar,
212+
}
213+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
214+
struct Bar {
215+
a: String,
216+
b: f64,
217+
}
218+
219+
let v = Foo {
220+
a: Some(Box::new(Foo {
221+
a: None,
222+
b: Bar { a: "foo".to_string(), b: 4.5 },
223+
})),
224+
b: Bar { a: "bar".to_string(), b: 1.0 },
225+
};
226+
assert_eq!(encode!(v),
227+
bdoc! {
228+
"a" => {
229+
"b" => {
230+
"a" => "foo",
231+
"b" => (4.5)
232+
}
233+
},
234+
"b" => {
235+
"a" => "bar",
236+
"b" => (1.0)
237+
}
238+
});
239+
assert_eq!(v, decode!(encode!(v)));
240+
}
241+
204242
#[test]
205243
fn hashmap() {
206244
#[derive(Serialize, Deserialize, PartialEq, Debug)]
@@ -295,7 +333,7 @@ fn missing_errors() {
295333

296334
let mut d = Decoder::new(bdoc! {});
297335
let a: Result<Foo, DecoderError> = Deserialize::deserialize(&mut d);
298-
336+
299337
assert!(a.is_err());
300338
}
301339

@@ -305,18 +343,28 @@ fn parse_enum() {
305343
struct Foo { a: E }
306344
#[derive(Serialize, Deserialize, PartialEq, Debug)]
307345
enum E {
346+
Empty,
308347
Bar(i32),
309348
Baz(f64),
349+
Pair(i32, i32),
310350
Last(Foo2),
351+
Vector(Vec<i32>),
352+
Named { a: i32 },
353+
MultiNamed { a: i32, b: i32 },
311354
}
312355
#[derive(Serialize, Deserialize, PartialEq, Debug)]
313356
struct Foo2 {
314357
test: String,
315358
}
316359

360+
let v = Foo { a: E::Empty };
361+
assert_eq!(
362+
encode!(v),
363+
bdoc! { "a" => "Empty" }
364+
);
365+
assert_eq!(v, decode!(encode!(v)));
366+
317367
let v = Foo { a: E::Bar(10) };
318-
// technically serde is correct here. a single element tuple still is a
319-
// tuple and therefor a sequence
320368
assert_eq!(
321369
encode!(v),
322370
bdoc! { "a" => { "Bar" => 10 } }
@@ -326,7 +374,14 @@ fn parse_enum() {
326374
let v = Foo { a: E::Baz(10.2) };
327375
assert_eq!(
328376
encode!(v),
329-
bdoc! { "a" => { "Baz" => (10.2) } }
377+
bdoc! { "a" => { "Baz" => 10.2 } }
378+
);
379+
assert_eq!(v, decode!(encode!(v)));
380+
381+
let v = Foo { a: E::Pair(12,42) };
382+
assert_eq!(
383+
encode!(v),
384+
bdoc! { "a" => { "Pair" => [ 12, 42] } }
330385
);
331386
assert_eq!(v, decode!(encode!(v)));
332387

@@ -336,6 +391,26 @@ fn parse_enum() {
336391
bdoc! { "a" => { "Last" => { "test" => "test" } } }
337392
);
338393
assert_eq!(v, decode!(encode!(v)));
394+
395+
let v = Foo { a: E::Vector(vec!(12,42)) };
396+
assert_eq!(
397+
encode!(v),
398+
bdoc! { "a" => { "Vector" => [ 12, 42 ] } }
399+
);
400+
assert_eq!(v, decode!(encode!(v)));
401+
402+
let v = Foo { a: E::Named { a: 12 } };
403+
assert_eq!(
404+
encode!(v),
405+
bdoc! { "a" => { "Named" => { "a" => 12 } } }
406+
);
407+
assert_eq!(v, decode!(encode!(v)));
408+
let v = Foo { a: E::MultiNamed { a: 12, b: 42 } };
409+
assert_eq!(
410+
encode!(v),
411+
bdoc! { "a" => { "MultiNamed" => { "a" => 12, "b" => 42 } } }
412+
);
413+
assert_eq!(v, decode!(encode!(v)));
339414
}
340415

341416
#[test]

src/decoder/serde.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,13 @@ impl Deserializer for Decoder {
256256
{
257257
let value = match self.value.take() {
258258
Some(Bson::Document(value)) => value,
259+
Some(Bson::String(variant)) => {
260+
return visitor.visit(VariantDecoder {
261+
de: self,
262+
val: None,
263+
variant: Some(Bson::String(variant)),
264+
})
265+
}
259266
Some(_) => {
260267
return Err(de::Error::invalid_value("expected an enum"));
261268
}
@@ -343,9 +350,13 @@ impl<'a> VariantVisitor for VariantDecoder<'a> {
343350
}
344351

345352
fn visit_unit(&mut self) -> DecoderResult<()> {
346-
Deserialize::deserialize(&mut Decoder::new(try!(self.val
347-
.take()
348-
.ok_or(DecoderError::EndOfStream))))
353+
match self.val.take() {
354+
None => Ok(()),
355+
Some(val) => {
356+
try!(Deserialize::deserialize(&mut Decoder::new(val)));
357+
Ok(())
358+
}
359+
}
349360
}
350361

351362
fn visit_newtype<T>(&mut self) -> DecoderResult<T>

src/encoder/serde.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,7 @@ impl Serializer for Encoder {
216216
_variant_index: usize,
217217
variant: &'static str)
218218
-> EncoderResult<()> {
219-
let mut unit_variant = Document::new();
220-
unit_variant.insert(variant.to_string(), Bson::Array(vec![]));
221-
222-
self.value = Bson::Document(unit_variant);
219+
self.value = Bson::String(variant.to_string());
223220
Ok(())
224221
}
225222

@@ -330,7 +327,11 @@ impl Serializer for Encoder {
330327
#[inline]
331328
fn serialize_tuple_variant_end(&mut self, state: TupleVariantState) -> EncoderResult<()> {
332329
let mut tuple_variant = Document::new();
333-
tuple_variant.insert(state.name.to_string(), Bson::Array(state.array));
330+
if state.array.len() == 1 {
331+
tuple_variant.insert(state.name.to_string(), state.array.into_iter().next().unwrap());
332+
} else {
333+
tuple_variant.insert(state.name.to_string(), Bson::Array(state.array));
334+
}
334335

335336
self.value = Bson::Document(tuple_variant);
336337
Ok(())

0 commit comments

Comments
 (0)