Implement Deserializer::set_require_newline_after_table
This commit is contained in:
parent
35ea81f136
commit
d02c02d995
32
src/de.rs
32
src/de.rs
|
@ -581,7 +581,7 @@ impl<'a> Deserializer<'a> {
|
||||||
Deserializer {
|
Deserializer {
|
||||||
tokens: Tokenizer::new(input),
|
tokens: Tokenizer::new(input),
|
||||||
input: input,
|
input: input,
|
||||||
require_newline_after_table: false,
|
require_newline_after_table: true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -626,8 +626,22 @@ impl<'a> Deserializer<'a> {
|
||||||
let start = self.tokens.current();
|
let start = self.tokens.current();
|
||||||
self.expect(Token::LeftBracket)?;
|
self.expect(Token::LeftBracket)?;
|
||||||
let array = self.eat(Token::LeftBracket)?;
|
let array = self.eat(Token::LeftBracket)?;
|
||||||
let ret = Header::new(self.tokens.clone(), array);
|
let ret = Header::new(self.tokens.clone(),
|
||||||
self.tokens.skip_to_newline();
|
array,
|
||||||
|
self.require_newline_after_table);
|
||||||
|
if self.require_newline_after_table {
|
||||||
|
self.tokens.skip_to_newline();
|
||||||
|
} else {
|
||||||
|
loop {
|
||||||
|
match self.next()? {
|
||||||
|
Some(Token::RightBracket) |
|
||||||
|
Some(Token::Newline) |
|
||||||
|
None => break,
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.eat_whitespace()?;
|
||||||
|
}
|
||||||
Ok(Line::Table { at: start, header: ret, array: array })
|
Ok(Line::Table { at: start, header: ret, array: array })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1134,15 +1148,19 @@ enum Line<'a> {
|
||||||
struct Header<'a> {
|
struct Header<'a> {
|
||||||
first: bool,
|
first: bool,
|
||||||
array: bool,
|
array: bool,
|
||||||
|
require_newline_after_table: bool,
|
||||||
tokens: Tokenizer<'a>,
|
tokens: Tokenizer<'a>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Header<'a> {
|
impl<'a> Header<'a> {
|
||||||
fn new(tokens: Tokenizer<'a>, array: bool) -> Header<'a> {
|
fn new(tokens: Tokenizer<'a>,
|
||||||
|
array: bool,
|
||||||
|
require_newline_after_table: bool) -> Header<'a> {
|
||||||
Header {
|
Header {
|
||||||
first: true,
|
first: true,
|
||||||
array: array,
|
array: array,
|
||||||
tokens: tokens,
|
tokens: tokens,
|
||||||
|
require_newline_after_table: require_newline_after_table,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1160,8 +1178,10 @@ impl<'a> Header<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
self.tokens.eat_whitespace()?;
|
self.tokens.eat_whitespace()?;
|
||||||
if !self.tokens.eat_comment()? {
|
if self.require_newline_after_table {
|
||||||
self.tokens.eat_newline_or_eof()?;
|
if !self.tokens.eat_comment()? {
|
||||||
|
self.tokens.eat_newline_or_eof()?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
|
|
14
tests/backcompat.rs
Normal file
14
tests/backcompat.rs
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
extern crate toml;
|
||||||
|
extern crate serde;
|
||||||
|
|
||||||
|
use serde::de::Deserialize;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn main() {
|
||||||
|
assert!("[a] foo = 1".parse::<toml::Value>().is_err());
|
||||||
|
|
||||||
|
let mut d = toml::de::Deserializer::new("[a] foo = 1");
|
||||||
|
d.set_require_newline_after_table(false);
|
||||||
|
let value = toml::Value::deserialize(&mut d).unwrap();
|
||||||
|
assert_eq!(value["a"]["foo"].as_integer(), Some(1));
|
||||||
|
}
|
Loading…
Reference in a new issue