aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2017-06-01 08:36:08 -0500
committerGitHub <noreply@github.com>2017-06-01 08:36:08 -0500
commit36431af975092578648225c60a8494cb0d5f6844 (patch)
tree56d5a901235aa8fb7c157c0f348b257c54fa1648
parent95e1c738467c87f4072ac29923e7df399ebfe9ea (diff)
parent20dced6967398c19ae8d502bd916cc294df6a3d4 (diff)
downloadmilf-rs-36431af975092578648225c60a8494cb0d5f6844.tar.gz
milf-rs-36431af975092578648225c60a8494cb0d5f6844.zip
Merge pull request #184 from alanhdu/master
Serialize nested array of tables correctly
-rw-r--r--src/ser.rs22
-rw-r--r--tests/serde.rs4
-rw-r--r--tests/valid.rs4
-rw-r--r--tests/valid/table-array-nest-no-keys.json14
-rw-r--r--tests/valid/table-array-nest-no-keys.toml6
5 files changed, 45 insertions, 5 deletions
diff --git a/src/ser.rs b/src/ser.rs
index 22eda81..8f6b366 100644
--- a/src/ser.rs
+++ b/src/ser.rs
@@ -308,8 +308,28 @@ impl<'a> Serializer<'a> {
State::Array { .. } => true,
_ => false,
};
+
+ // Unlike [..]s, we can't omit [[..]] ancestors, so be sure to emit table
+ // headers for them.
+ let mut p = state;
+ if let State::Array { first, parent, .. } = *state {
+ if first.get() {
+ p = parent;
+ }
+ }
+ while let State::Table { first, parent, .. } = *p {
+ p = parent;
+ if !first.get() {
+ break;
+ }
+ if let State::Array { parent: &State::Table {..}, ..} = *parent {
+ self.emit_table_header(parent)?;
+ break;
+ }
+ }
+
match *state {
- State::Table { first , .. } |
+ State::Table { first, .. } |
State::Array { parent: &State::Table { first, .. }, .. } => {
if !first.get() {
self.dst.push_str("\n");
diff --git a/tests/serde.rs b/tests/serde.rs
index 0f4c37a..2f8d871 100644
--- a/tests/serde.rs
+++ b/tests/serde.rs
@@ -61,10 +61,6 @@ macro_rules! error {
})
}
-macro_rules! decode( ($t:expr) => ({
- t!($t.try_into())
-}) );
-
macro_rules! map( ($($k:ident: $v:expr),*) => ({
let mut _m = BTreeMap::new();
$(_m.insert(stringify!($k).to_string(), $v);)*
diff --git a/tests/valid.rs b/tests/valid.rs
index e8ea6af..676fc67 100644
--- a/tests/valid.rs
+++ b/tests/valid.rs
@@ -189,3 +189,7 @@ test!(example4,
test!(example_bom,
include_str!("valid/example-bom.toml"),
include_str!("valid/example.json"));
+
+test!(table_array_nest_no_keys,
+ include_str!("valid/table-array-nest-no-keys.toml"),
+ include_str!("valid/table-array-nest-no-keys.json"));
diff --git a/tests/valid/table-array-nest-no-keys.json b/tests/valid/table-array-nest-no-keys.json
new file mode 100644
index 0000000..7537b1a
--- /dev/null
+++ b/tests/valid/table-array-nest-no-keys.json
@@ -0,0 +1,14 @@
+{
+ "albums": [
+ {
+ "songs": [{}, {}]
+ }
+ ],
+ "artists": [
+ {
+ "home": {
+ "address": {}
+ }
+ }
+ ]
+}
diff --git a/tests/valid/table-array-nest-no-keys.toml b/tests/valid/table-array-nest-no-keys.toml
new file mode 100644
index 0000000..ad6eb10
--- /dev/null
+++ b/tests/valid/table-array-nest-no-keys.toml
@@ -0,0 +1,6 @@
+[[ albums ]]
+ [[ albums.songs ]]
+ [[ albums.songs ]]
+
+[[ artists ]]
+ [ artists.home.address ]