]> git.proxmox.com Git - rustc.git/blobdiff - vendor/toml/src/de.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / vendor / toml / src / de.rs
index 98b3a60ac38fae1d2c63885145312953d4b18622..64112932a2d7189b2e0f13df21b08d8edbe546af 100644 (file)
@@ -191,6 +191,9 @@ enum ErrorKind {
         available: &'static [&'static str],
     },
 
+    /// Unquoted string was found when quoted one was expected
+    UnquotedString,
+
     #[doc(hidden)]
     __Nonexhaustive,
 }
@@ -333,7 +336,7 @@ fn build_table_indices<'de>(tables: &[Table<'de>]) -> HashMap<Vec<Cow<'de, str>>
     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
 }
@@ -359,7 +362,7 @@ fn build_table_pindices<'de>(tables: &[Table<'de>]) -> HashMap<Vec<Cow<'de, str>
         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);
         }
     }
@@ -680,7 +683,7 @@ impl<'de, 'b> de::Deserializer<'de> for MapVisitor<'de, 'b> {
         }
         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();
@@ -1428,7 +1431,7 @@ impl<'a> Deserializer<'a> {
                 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 {
@@ -1451,13 +1454,25 @@ impl<'a> Deserializer<'a> {
                         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')
@@ -1633,7 +1648,7 @@ impl<'a> Deserializer<'a> {
 
             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));
                 }
@@ -2076,7 +2091,7 @@ impl std::convert::From<Error> for std::io::Error {
 
 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,
@@ -2131,6 +2146,10 @@ impl fmt::Display for Error {
                 "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!(),
         }