available: &'static [&'static str],
},
+ /// Unquoted string was found when quoted one was expected
+ UnquotedString,
+
#[doc(hidden)]
__Nonexhaustive,
}
let mut res = HashMap::new();
for (i, table) in tables.iter().enumerate() {
let header = table.header.iter().map(|v| v.1.clone()).collect::<Vec<_>>();
- res.entry(header).or_insert(Vec::new()).push(i);
+ res.entry(header).or_insert_with(Vec::new).push(i);
}
res
}
let header = table.header.iter().map(|v| v.1.clone()).collect::<Vec<_>>();
for len in 0..=header.len() {
res.entry(header[..len].to_owned())
- .or_insert(Vec::new())
+ .or_insert_with(Vec::new)
.push(i);
}
}
}
let table = &mut self.tables[0];
let values = table.values.take().expect("table has no values?");
- if table.header.len() == 0 {
+ if table.header.is_empty() {
return Err(self.de.error(self.cur, ErrorKind::EmptyTableKey));
}
let name = table.header[table.header.len() - 1].1.to_owned();
start,
end,
},
- Some((span, Token::Keylike(key))) => self.number_or_date(span, key)?,
+ Some((span, Token::Keylike(key))) => self.parse_keylike(at, span, key)?,
Some((span, Token::Plus)) => self.number_leading_plus(span)?,
Some((Span { start, .. }, Token::LeftBrace)) => {
self.inline_table().map(|(Span { end, .. }, table)| Value {
expected: "a value",
found: token.1.describe(),
},
- ))
+ ));
}
None => return Err(self.eof()),
};
Ok(value)
}
+ fn parse_keylike(&mut self, at: usize, span: Span, key: &'a str) -> Result<Value<'a>, Error> {
+ if key == "inf" || key == "nan" {
+ return self.number_or_date(span, key);
+ }
+
+ let first_char = key.chars().next().expect("key should not be empty here");
+ match first_char {
+ '-' | '0'..='9' => self.number_or_date(span, key),
+ _ => Err(self.error(at, ErrorKind::UnquotedString)),
+ }
+ }
+
fn number_or_date(&mut self, span: Span, s: &'a str) -> Result<Value<'a>, Error> {
if s.contains('T')
|| s.contains('t')
if c == '0' && first {
first_zero = true;
- } else if c.to_digit(radix).is_some() {
+ } else if c.is_digit(radix) {
if !first && first_zero && !allow_leading_zeros {
return Err(self.error(at, ErrorKind::NumberInvalid));
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- match self.inner.kind {
+ match &self.inner.kind {
ErrorKind::UnexpectedEof => "unexpected eof encountered".fmt(f)?,
ErrorKind::InvalidCharInString(c) => write!(
f,
"unexpected keys in table: `{:?}`, available keys: `{:?}`",
keys, available
)?,
+ ErrorKind::UnquotedString => write!(
+ f,
+ "invalid TOML value, did you mean to use a quoted string?"
+ )?,
ErrorKind::__Nonexhaustive => panic!(),
}