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
This commit is contained in:
Garrett Berg 2017-07-26 22:08:22 -06:00
parent 05a8c73439
commit 61ff3c295c
5 changed files with 44 additions and 0 deletions

View file

@ -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(())
}
}

View file

@ -554,3 +554,25 @@ fn newtypes2() {
}),
}
}
#[derive(Debug, Default, PartialEq, Serialize, Deserialize)]
struct CanBeEmpty {
a: Option<String>,
b: Option<String>,
}
#[test]
fn table_structs_empty() {
let text = "[bar]\n\n[baz]\n\n[bazv]\na = \"foo\"\n\n[foo]\n";
let value: BTreeMap<String, CanBeEmpty> = toml::from_str(text).unwrap();
let mut expected: BTreeMap<String, CanBeEmpty> = 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);
}

View file

@ -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"));

View file

@ -0,0 +1,5 @@
{
"a": { "b": {} },
"b": {},
"c": { "a": {} }
}

View file

@ -0,0 +1,5 @@
[a]
[a.b]
[b]
[c]
[c.a]