Skip to content

Commit 67112f8

Browse files
committed
WIP fix nested vec serialization: #186
1 parent 920e54d commit 67112f8

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

src/ser/mod.rs

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,11 @@ impl<'ser, W: Write> serde::ser::Serializer for &'ser mut Serializer<W> {
400400
mod tests {
401401
use super::*;
402402
use serde::Serialize;
403+
use simple_logger::SimpleLogger;
404+
405+
fn init_logger() {
406+
SimpleLogger::new().with_utc_timestamps().init().unwrap();
407+
}
403408

404409
#[test]
405410
fn test_serialize_struct() {
@@ -447,4 +452,64 @@ mod tests {
447452
let got = String::from_utf8(buffer).unwrap();
448453
assert_eq!(got, should_be);
449454
}
455+
456+
#[test]
457+
fn test_serialize_nested_structs() {
458+
#[derive(Debug, Serialize, PartialEq)]
459+
struct Outer {
460+
a: Inner,
461+
}
462+
463+
#[derive(Debug, Serialize, PartialEq)]
464+
struct Inner {
465+
name: String,
466+
}
467+
468+
let coll = Outer {
469+
a: Inner {
470+
name: "42".to_owned(),
471+
},
472+
};
473+
474+
let str = to_string(&coll).unwrap();
475+
println!("str={:?}", str);
476+
}
477+
#[test]
478+
fn test_serialize_nested_collection() {
479+
init_logger();
480+
481+
#[derive(Debug, Serialize, PartialEq)]
482+
struct OuterCollection {
483+
a: Vec<A>,
484+
}
485+
486+
#[derive(Debug, Serialize, PartialEq)]
487+
struct A {
488+
name: String,
489+
}
490+
491+
let coll = OuterCollection {
492+
a: vec![A {
493+
name: "42".to_owned(),
494+
}],
495+
};
496+
497+
let str = to_string(&coll).unwrap();
498+
println!("str={:?}", str);
499+
}
500+
501+
#[test]
502+
fn test_serialize_vector() {
503+
#[derive(Debug, Serialize, PartialEq)]
504+
struct OuterCollection {
505+
a: Vec<String>,
506+
}
507+
508+
let coll = OuterCollection {
509+
a: vec!["42".to_owned()],
510+
};
511+
512+
let str = to_string(&coll).unwrap();
513+
println!("str={:?}", str);
514+
}
450515
}

src/ser/seq.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use super::Serializer;
22
use crate::error::{Error, Result};
3+
use log::debug;
34
use serde::ser::Serialize;
45
use std::io::Write;
56

@@ -22,16 +23,20 @@ impl<'ser, W: 'ser + Write> serde::ser::SerializeSeq for SeqSeralizer<'ser, W> {
2223
T: ?Sized + Serialize,
2324
{
2425
let must_close_tag = self.ser.build_start_tag()?;
26+
debug!("start, must_close_tag={:?}", must_close_tag);
2527
value.serialize(&mut *self.ser)?;
2628
if must_close_tag {
29+
debug!("end");
2730
self.ser.end_tag()?;
2831
self.ser.reopen_tag()?;
2932
}
3033
Ok(())
3134
}
3235

3336
fn end(self) -> Result<()> {
34-
self.ser.abandon_tag()?;
37+
debug!("end");
38+
// TODO: Commenting this out fixes it, but unsure why
39+
// self.ser.abandon_tag()?;
3540
Ok(())
3641
}
3742
}

0 commit comments

Comments
 (0)