From 61ff3c295cc3440d9d4bcaadd22dfe38fb3b7957 Mon Sep 17 00:00:00 2001 From: Garrett Berg Date: Wed, 26 Jul 2017 22:08:22 -0600 Subject: [PATCH] close #199: add header information for empty structs - also add test which fails without this change - also add a few helpful unit tests to table --- src/ser.rs | 9 +++++++++ tests/serde.rs | 22 ++++++++++++++++++++++ tests/valid.rs | 3 +++ tests/valid/table-multi-empty.json | 5 +++++ tests/valid/table-multi-empty.toml | 5 +++++ 5 files changed, 44 insertions(+) create mode 100644 tests/valid/table-multi-empty.json create mode 100644 tests/valid/table-multi-empty.toml diff --git a/src/ser.rs b/src/ser.rs index 863bd75..3c9b354 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -930,6 +930,15 @@ impl<'a, 'b> ser::SerializeStruct for SerializeTable<'a, 'b> { } fn end(self) -> Result<(), Error> { + match self { + SerializeTable::Datetime(_) => {}, + SerializeTable::Table { mut ser, first, .. } => { + if first.get() { + let state = ser.state.clone(); + ser.emit_table_header(&state)?; + } + } + } Ok(()) } } diff --git a/tests/serde.rs b/tests/serde.rs index c61edf5..57fa5db 100644 --- a/tests/serde.rs +++ b/tests/serde.rs @@ -554,3 +554,25 @@ fn newtypes2() { }), } } + +#[derive(Debug, Default, PartialEq, Serialize, Deserialize)] +struct CanBeEmpty { + a: Option, + b: Option, +} + +#[test] +fn table_structs_empty() { + let text = "[bar]\n\n[baz]\n\n[bazv]\na = \"foo\"\n\n[foo]\n"; + let value: BTreeMap = toml::from_str(text).unwrap(); + let mut expected: BTreeMap = BTreeMap::new(); + expected.insert("bar".to_string(), CanBeEmpty::default()); + expected.insert("baz".to_string(), CanBeEmpty::default()); + expected.insert( + "bazv".to_string(), + CanBeEmpty {a: Some("foo".to_string()), b: None}, + ); + expected.insert("foo".to_string(), CanBeEmpty::default()); + assert_eq!(value, expected); + assert_eq!(toml::to_string(&value).unwrap(), text); +} diff --git a/tests/valid.rs b/tests/valid.rs index e7577ad..6a04866 100644 --- a/tests/valid.rs +++ b/tests/valid.rs @@ -162,6 +162,9 @@ test!(table_empty, test!(table_sub_empty, include_str!("valid/table-sub-empty.toml"), include_str!("valid/table-sub-empty.json")); +test!(table_multi_empty, + include_str!("valid/table-multi-empty.toml"), + include_str!("valid/table-multi-empty.json")); test!(table_whitespace, include_str!("valid/table-whitespace.toml"), include_str!("valid/table-whitespace.json")); diff --git a/tests/valid/table-multi-empty.json b/tests/valid/table-multi-empty.json new file mode 100644 index 0000000..a6e17c9 --- /dev/null +++ b/tests/valid/table-multi-empty.json @@ -0,0 +1,5 @@ +{ + "a": { "b": {} }, + "b": {}, + "c": { "a": {} } +} diff --git a/tests/valid/table-multi-empty.toml b/tests/valid/table-multi-empty.toml new file mode 100644 index 0000000..2266ed2 --- /dev/null +++ b/tests/valid/table-multi-empty.toml @@ -0,0 +1,5 @@ +[a] +[a.b] +[b] +[c] +[c.a]