aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Huss <eric@huss.org>2018-07-27 11:49:30 -0700
committerEric Huss <eric@huss.org>2018-07-27 11:49:30 -0700
commitd6f383d20c2dbefd9ece0834b05310dfae4e2a88 (patch)
tree98529f0dbc9c75e795e720dd37945b1e189bf450
parent2b6e286fb6244690a6572ebde4e139cbf7a52053 (diff)
downloadmilf-rs-d6f383d20c2dbefd9ece0834b05310dfae4e2a88.tar.gz
milf-rs-d6f383d20c2dbefd9ece0834b05310dfae4e2a88.zip
Don't allow intermixing inline tables and dotted key tables.
-rw-r--r--src/de.rs10
-rw-r--r--test-suite/tests/valid/dotted-keys.json10
-rw-r--r--test-suite/tests/valid/dotted-keys.toml4
3 files changed, 7 insertions, 17 deletions
diff --git a/src/de.rs b/src/de.rs
index 65632fc..517a62b 100644
--- a/src/de.rs
+++ b/src/de.rs
@@ -526,7 +526,7 @@ impl<'de> de::Deserializer<'de> for ValueDeserializer<'de> {
s.end()?;
Ok(ret)
}
- E::InlineTable(values) => {
+ E::InlineTable(values) | E::DottedTable(values) => {
visitor.visit_map(InlineTableDeserializer {
values: values.into_iter(),
next_value: None,
@@ -1180,7 +1180,7 @@ impl<'a> Deserializer<'a> {
return Ok(());
}
match values.iter_mut().find(|&&mut (ref k, _)| *k == key) {
- Some(&mut (_, Value { e: E::InlineTable(ref mut v), .. })) => {
+ Some(&mut (_, Value { e: E::DottedTable(ref mut v), .. })) => {
return self.add_dotted_key(key_parts, value, v);
}
Some(&mut (_, Value { start, .. })) => {
@@ -1190,13 +1190,13 @@ impl<'a> Deserializer<'a> {
}
// The start/end value is somewhat misleading here.
let inline_table = Value {
- e: E::InlineTable(Vec::new()),
+ e: E::DottedTable(Vec::new()),
start: value.start,
end: value.end,
};
values.push((key, inline_table));
let last_i = values.len() - 1;
- if let (_, Value { e: E::InlineTable(ref mut v), .. }) = values[last_i] {
+ if let (_, Value { e: E::DottedTable(ref mut v), .. }) = values[last_i] {
self.add_dotted_key(key_parts, value, v)?;
}
Ok(())
@@ -1499,6 +1499,7 @@ enum E<'a> {
Datetime(&'a str),
Array(Vec<Value<'a>>),
InlineTable(Vec<(Cow<'a, str>, Value<'a>)>),
+ DottedTable(Vec<(Cow<'a, str>, Value<'a>)>),
}
impl<'a> Value<'a> {
@@ -1511,6 +1512,7 @@ impl<'a> Value<'a> {
(&E::Datetime(..), &E::Datetime(..)) |
(&E::Array(..), &E::Array(..)) |
(&E::InlineTable(..), &E::InlineTable(..)) => true,
+ (&E::DottedTable(..), &E::DottedTable(..)) => true,
_ => false,
}
diff --git a/test-suite/tests/valid/dotted-keys.json b/test-suite/tests/valid/dotted-keys.json
index e32079a..cf9dd04 100644
--- a/test-suite/tests/valid/dotted-keys.json
+++ b/test-suite/tests/valid/dotted-keys.json
@@ -19,16 +19,6 @@
}
},
"in": {
- "bar": {
- "type": "integer",
- "value": "2"
- },
- "foo": {
- "type": "integer",
- "value": "1"
- }
- },
- "in2": {
"type": {
"color": {
"type": "string",
diff --git a/test-suite/tests/valid/dotted-keys.toml b/test-suite/tests/valid/dotted-keys.toml
index 27dbd32..234d64c 100644
--- a/test-suite/tests/valid/dotted-keys.toml
+++ b/test-suite/tests/valid/dotted-keys.toml
@@ -3,7 +3,5 @@ a.b = 123
[table]
a.b.c = 1
a . b . d = 2
-in = {foo = 1}
-in.bar = 2
-in2 = { type.name = "cat", type.color = "blue" }
+in = { type.name = "cat", type.color = "blue" }