diff --git a/src/de.rs b/src/de.rs index 6411293..40d88ae 100644 --- a/src/de.rs +++ b/src/de.rs @@ -1993,7 +1993,6 @@ impl<'a> Deserializer<'a> { expected, found, } => self.error(at, ErrorKind::Wanted { expected, found }), - TokenError::EmptyTableKey(at) => self.error(at, ErrorKind::EmptyTableKey), TokenError::MultilineStringKey(at) => self.error(at, ErrorKind::MultilineStringKey), } } diff --git a/src/ser.rs b/src/ser.rs index 0eb2bfb..90c5acf 100644 --- a/src/ser.rs +++ b/src/ser.rs @@ -509,10 +509,11 @@ impl<'a> Serializer<'a> { } fn escape_key(&mut self, key: &str) -> Result<(), Error> { - let ok = key.chars().all(|c| match c { - 'a'..='z' | 'A'..='Z' | '0'..='9' | '-' | '_' => true, - _ => false, - }); + let ok = key.len() > 0 + && key.chars().all(|c| match c { + 'a'..='z' | 'A'..='Z' | '0'..='9' | '-' | '_' => true, + _ => false, + }); if ok { write!(self.dst, "{}", key).map_err(ser::Error::custom)?; } else { diff --git a/src/tokens.rs b/src/tokens.rs index fd8b6b9..c242282 100644 --- a/src/tokens.rs +++ b/src/tokens.rs @@ -56,7 +56,6 @@ pub enum Error { UnterminatedString(usize), NewlineInTableKey(usize), MultilineStringKey(usize), - EmptyTableKey(usize), Wanted { at: usize, expected: &'static str, @@ -194,9 +193,6 @@ impl<'a> Tokenizer<'a> { if multiline { return Err(Error::MultilineStringKey(offset)); } - if val == "" { - return Err(Error::EmptyTableKey(offset)); - } match src.find('\n') { None => Ok((span, val)), Some(i) => Err(Error::NewlineInTableKey(offset + i)), diff --git a/test-suite/tests/invalid-misc.rs b/test-suite/tests/invalid-misc.rs index cea0801..7a10192 100644 --- a/test-suite/tests/invalid-misc.rs +++ b/test-suite/tests/invalid-misc.rs @@ -14,7 +14,7 @@ fn bad() { bad!("a = 01", "invalid number at line 1 column 6"); bad!("a = 1__1", "invalid number at line 1 column 5"); bad!("a = 1_", "invalid number at line 1 column 5"); - bad!("''", "empty table key found at line 1 column 1"); + bad!("''", "expected an equals, found eof at line 1 column 3"); bad!("a = 9e99999", "invalid number at line 1 column 5"); bad!( diff --git a/test-suite/tests/parser.rs b/test-suite/tests/parser.rs index 169df79..b28fce0 100644 --- a/test-suite/tests/parser.rs +++ b/test-suite/tests/parser.rs @@ -342,12 +342,14 @@ fn bad_keys() { "key|=3", "unexpected character found: `|` at line 1 column 4" ); - bad!("\"\"=3", "empty table key found at line 1 column 1"); bad!( "=3", "expected a table key, found an equals at line 1 column 1" ); - bad!("\"\"|=3", "empty table key found at line 1 column 1"); + bad!( + "\"\"|=3", + "unexpected character found: `|` at line 1 column 3" + ); bad!("\"\n\"|=3", "newline in string found at line 1 column 2"); bad!( "\"\r\"|=3", @@ -381,12 +383,10 @@ fn bad_table_names() { "[.]", "expected a table key, found a period at line 1 column 2" ); - bad!("[\"\".\"\"]", "empty table key found at line 1 column 2"); bad!( "[a.]", "expected a table key, found a right bracket at line 1 column 4" ); - bad!("[\"\"]", "empty table key found at line 1 column 2"); bad!("[!]", "unexpected character found: `!` at line 1 column 2"); bad!("[\"\n\"]", "newline in string found at line 1 column 3"); bad!( diff --git a/test-suite/tests/valid.rs b/test-suite/tests/valid.rs index 0745cc8..ad0dea9 100644 --- a/test-suite/tests/valid.rs +++ b/test-suite/tests/valid.rs @@ -231,6 +231,11 @@ test!( include_str!("valid/key-with-pound.toml"), include_str!("valid/key-with-pound.json") ); +test!( + key_empty, + include_str!("valid/key-empty.toml"), + include_str!("valid/key-empty.json") +); test!( long_float, include_str!("valid/long-float.toml"), diff --git a/test-suite/tests/valid/key-empty.json b/test-suite/tests/valid/key-empty.json new file mode 100644 index 0000000..99afee4 --- /dev/null +++ b/test-suite/tests/valid/key-empty.json @@ -0,0 +1,3 @@ +{ + "": {"type": "integer", "value": "1"} +} diff --git a/test-suite/tests/valid/key-empty.toml b/test-suite/tests/valid/key-empty.toml new file mode 100644 index 0000000..2f6a07c --- /dev/null +++ b/test-suite/tests/valid/key-empty.toml @@ -0,0 +1 @@ +"" = 1