1 //! Deserializing TOML into Rust structures.
2 //!
3 //! This module contains all the Serde support for deserializing TOML documents
4 //! into Rust structures. Note that some top-level functions here are also
5 //! provided at the top of the crate.
6 
7 use std::borrow::Cow;
8 use std::error;
9 use std::f64;
10 use std::fmt;
11 use std::str;
12 use std::vec;
13 
14 use serde::de;
15 use serde::de::value::BorrowedStrDeserializer;
16 use serde::de::IntoDeserializer;
17 
18 use crate::datetime;
19 use crate::spanned;
20 use crate::tokens::{Error as TokenError, Span, Token, Tokenizer};
21 
22 /// Deserializes a byte slice into a type.
23 ///
24 /// This function will attempt to interpret `bytes` as UTF-8 data and then
25 /// deserialize `T` from the TOML document provided.
from_slice<'de, T>(bytes: &'de [u8]) -> Result<T, Error> where T: de::Deserialize<'de>,26 pub fn from_slice<'de, T>(bytes: &'de [u8]) -> Result<T, Error>
27 where
28     T: de::Deserialize<'de>,
29 {
30     match str::from_utf8(bytes) {
31         Ok(s) => from_str(s),
32         Err(e) => Err(Error::custom(e.to_string())),
33     }
34 }
35 
36 /// Deserializes a string into a type.
37 ///
38 /// This function will attempt to interpret `s` as a TOML document and
39 /// deserialize `T` from the document.
40 ///
41 /// # Examples
42 ///
43 /// ```
44 /// use serde_derive::Deserialize;
45 ///
46 /// #[derive(Deserialize)]
47 /// struct Config {
48 ///     title: String,
49 ///     owner: Owner,
50 /// }
51 ///
52 /// #[derive(Deserialize)]
53 /// struct Owner {
54 ///     name: String,
55 /// }
56 ///
57 /// fn main() {
58 ///     let config: Config = toml::from_str(r#"
59 ///         title = 'TOML Example'
60 ///
61 ///         [owner]
62 ///         name = 'Lisa'
63 ///     "#).unwrap();
64 ///
65 ///     assert_eq!(config.title, "TOML Example");
66 ///     assert_eq!(config.owner.name, "Lisa");
67 /// }
68 /// ```
from_str<'de, T>(s: &'de str) -> Result<T, Error> where T: de::Deserialize<'de>,69 pub fn from_str<'de, T>(s: &'de str) -> Result<T, Error>
70 where
71     T: de::Deserialize<'de>,
72 {
73     let mut d = Deserializer::new(s);
74     let ret = T::deserialize(&mut d)?;
75     d.end()?;
76     Ok(ret)
77 }
78 
79 /// Errors that can occur when deserializing a type.
80 #[derive(Debug, PartialEq, Clone)]
81 pub struct Error {
82     inner: Box<ErrorInner>,
83 }
84 
85 #[derive(Debug, PartialEq, Clone)]
86 struct ErrorInner {
87     kind: ErrorKind,
88     line: Option<usize>,
89     col: usize,
90     message: String,
91     key: Vec<String>,
92 }
93 
94 /// Errors that can occur when deserializing a type.
95 #[derive(Debug, PartialEq, Clone)]
96 enum ErrorKind {
97     /// EOF was reached when looking for a value
98     UnexpectedEof,
99 
100     /// An invalid character not allowed in a string was found
101     InvalidCharInString(char),
102 
103     /// An invalid character was found as an escape
104     InvalidEscape(char),
105 
106     /// An invalid character was found in a hex escape
107     InvalidHexEscape(char),
108 
109     /// An invalid escape value was specified in a hex escape in a string.
110     ///
111     /// Valid values are in the plane of unicode codepoints.
112     InvalidEscapeValue(u32),
113 
114     /// A newline in a string was encountered when one was not allowed.
115     NewlineInString,
116 
117     /// An unexpected character was encountered, typically when looking for a
118     /// value.
119     Unexpected(char),
120 
121     /// An unterminated string was found where EOF was found before the ending
122     /// EOF mark.
123     UnterminatedString,
124 
125     /// A newline was found in a table key.
126     NewlineInTableKey,
127 
128     /// A number failed to parse
129     NumberInvalid,
130 
131     /// A date or datetime was invalid
132     DateInvalid,
133 
134     /// Wanted one sort of token, but found another.
135     Wanted {
136         /// Expected token type
137         expected: &'static str,
138         /// Actually found token type
139         found: &'static str,
140     },
141 
142     /// An array was decoded but the types inside of it were mixed, which is
143     /// disallowed by TOML.
144     MixedArrayType,
145 
146     /// A duplicate table definition was found.
147     DuplicateTable(String),
148 
149     /// A previously defined table was redefined as an array.
150     RedefineAsArray,
151 
152     /// An empty table key was found.
153     EmptyTableKey,
154 
155     /// Multiline strings are not allowed for key
156     MultilineStringKey,
157 
158     /// A custom error which could be generated when deserializing a particular
159     /// type.
160     Custom,
161 
162     /// A tuple with a certain number of elements was expected but something
163     /// else was found.
164     ExpectedTuple(usize),
165 
166     /// Expected table keys to be in increasing tuple index order, but something
167     /// else was found.
168     ExpectedTupleIndex {
169         /// Expected index.
170         expected: usize,
171         /// Key that was specified.
172         found: String,
173     },
174 
175     /// An empty table was expected but entries were found
176     ExpectedEmptyTable,
177 
178     /// Dotted key attempted to extend something that is not a table.
179     DottedKeyInvalidType,
180 
181     /// An unexpected key was encountered.
182     ///
183     /// Used when deserializing a struct with a limited set of fields.
184     UnexpectedKeys {
185         /// The unexpected keys.
186         keys: Vec<String>,
187         /// Keys that may be specified.
188         available: &'static [&'static str],
189     },
190 
191     #[doc(hidden)]
192     __Nonexhaustive,
193 }
194 
195 /// Deserialization implementation for TOML.
196 pub struct Deserializer<'a> {
197     require_newline_after_table: bool,
198     allow_duplciate_after_longer_table: bool,
199     input: &'a str,
200     tokens: Tokenizer<'a>,
201 }
202 
203 impl<'de, 'b> de::Deserializer<'de> for &'b mut Deserializer<'de> {
204     type Error = Error;
205 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,206     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
207     where
208         V: de::Visitor<'de>,
209     {
210         let mut tables = self.tables()?;
211 
212         visitor.visit_map(MapVisitor {
213             values: Vec::new().into_iter(),
214             next_value: None,
215             depth: 0,
216             cur: 0,
217             cur_parent: 0,
218             max: tables.len(),
219             tables: &mut tables,
220             array: false,
221             de: self,
222         })
223     }
224 
225     // Called when the type to deserialize is an enum, as opposed to a field in the type.
deserialize_enum<V>( self, _name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,226     fn deserialize_enum<V>(
227         self,
228         _name: &'static str,
229         _variants: &'static [&'static str],
230         visitor: V,
231     ) -> Result<V::Value, Error>
232     where
233         V: de::Visitor<'de>,
234     {
235         let (value, name) = self.string_or_table()?;
236         match value.e {
237             E::String(val) => visitor.visit_enum(val.into_deserializer()),
238             E::InlineTable(values) => {
239                 if values.len() != 1 {
240                     Err(Error::from_kind(ErrorKind::Wanted {
241                         expected: "exactly 1 element",
242                         found: if values.is_empty() {
243                             "zero elements"
244                         } else {
245                             "more than 1 element"
246                         },
247                     }))
248                 } else {
249                     visitor.visit_enum(InlineTableDeserializer {
250                         values: values.into_iter(),
251                         next_value: None,
252                     })
253                 }
254             }
255             E::DottedTable(_) => visitor.visit_enum(DottedTableDeserializer {
256                 name: name.expect("Expected table header to be passed."),
257                 value: value,
258             }),
259             e @ _ => Err(Error::from_kind(ErrorKind::Wanted {
260                 expected: "string or table",
261                 found: e.type_name(),
262             })),
263         }
264     }
265 
266     serde::forward_to_deserialize_any! {
267         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
268         bytes byte_buf map struct unit newtype_struct
269         ignored_any unit_struct tuple_struct tuple option identifier
270     }
271 }
272 
273 struct Table<'a> {
274     at: usize,
275     header: Vec<Cow<'a, str>>,
276     values: Option<Vec<(Cow<'a, str>, Value<'a>)>>,
277     array: bool,
278 }
279 
280 #[doc(hidden)]
281 pub struct MapVisitor<'de: 'b, 'b> {
282     values: vec::IntoIter<(Cow<'de, str>, Value<'de>)>,
283     next_value: Option<(Cow<'de, str>, Value<'de>)>,
284     depth: usize,
285     cur: usize,
286     cur_parent: usize,
287     max: usize,
288     tables: &'b mut [Table<'de>],
289     array: bool,
290     de: &'b mut Deserializer<'de>,
291 }
292 
293 impl<'de, 'b> de::MapAccess<'de> for MapVisitor<'de, 'b> {
294     type Error = Error;
295 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed<'de>,296     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
297     where
298         K: de::DeserializeSeed<'de>,
299     {
300         if self.cur_parent == self.max || self.cur == self.max {
301             return Ok(None);
302         }
303 
304         loop {
305             assert!(self.next_value.is_none());
306             if let Some((key, value)) = self.values.next() {
307                 let ret = seed.deserialize(StrDeserializer::new(key.clone()))?;
308                 self.next_value = Some((key, value));
309                 return Ok(Some(ret));
310             }
311 
312             let next_table = {
313                 let prefix = &self.tables[self.cur_parent].header[..self.depth];
314                 self.tables[self.cur..self.max]
315                     .iter()
316                     .enumerate()
317                     .find(|&(_, t)| {
318                         if t.values.is_none() {
319                             return false;
320                         }
321                         match t.header.get(..self.depth) {
322                             Some(header) => header == prefix,
323                             None => false,
324                         }
325                     })
326                     .map(|(i, _)| i + self.cur)
327             };
328 
329             let pos = match next_table {
330                 Some(pos) => pos,
331                 None => return Ok(None),
332             };
333             self.cur = pos;
334 
335             // Test to see if we're duplicating our parent's table, and if so
336             // then this is an error in the toml format
337             if self.cur_parent != pos {
338                 if self.tables[self.cur_parent].header == self.tables[pos].header {
339                     let at = self.tables[pos].at;
340                     let name = self.tables[pos].header.join(".");
341                     return Err(self.de.error(at, ErrorKind::DuplicateTable(name)));
342                 }
343 
344                 // If we're here we know we should share the same prefix, and if
345                 // the longer table was defined first then we want to narrow
346                 // down our parent's length if possible to ensure that we catch
347                 // duplicate tables defined afterwards.
348                 if !self.de.allow_duplciate_after_longer_table {
349                     let parent_len = self.tables[self.cur_parent].header.len();
350                     let cur_len = self.tables[pos].header.len();
351                     if cur_len < parent_len {
352                         self.cur_parent = pos;
353                     }
354                 }
355             }
356 
357             let table = &mut self.tables[pos];
358 
359             // If we're not yet at the appropriate depth for this table then we
360             // just next the next portion of its header and then continue
361             // decoding.
362             if self.depth != table.header.len() {
363                 let key = &table.header[self.depth];
364                 let key = seed.deserialize(StrDeserializer::new(key.clone()))?;
365                 return Ok(Some(key));
366             }
367 
368             // Rule out cases like:
369             //
370             //      [[foo.bar]]
371             //      [[foo]]
372             if table.array {
373                 let kind = ErrorKind::RedefineAsArray;
374                 return Err(self.de.error(table.at, kind));
375             }
376 
377             self.values = table
378                 .values
379                 .take()
380                 .expect("Unable to read table values")
381                 .into_iter();
382         }
383     }
384 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: de::DeserializeSeed<'de>,385     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
386     where
387         V: de::DeserializeSeed<'de>,
388     {
389         if let Some((k, v)) = self.next_value.take() {
390             match seed.deserialize(ValueDeserializer::new(v)) {
391                 Ok(v) => return Ok(v),
392                 Err(mut e) => {
393                     e.add_key_context(&k);
394                     return Err(e);
395                 }
396             }
397         }
398 
399         let array =
400             self.tables[self.cur].array && self.depth == self.tables[self.cur].header.len() - 1;
401         self.cur += 1;
402         let res = seed.deserialize(MapVisitor {
403             values: Vec::new().into_iter(),
404             next_value: None,
405             depth: self.depth + if array { 0 } else { 1 },
406             cur_parent: self.cur - 1,
407             cur: 0,
408             max: self.max,
409             array: array,
410             tables: &mut *self.tables,
411             de: &mut *self.de,
412         });
413         res.map_err(|mut e| {
414             e.add_key_context(&self.tables[self.cur - 1].header[self.depth]);
415             e
416         })
417     }
418 }
419 
420 impl<'de, 'b> de::SeqAccess<'de> for MapVisitor<'de, 'b> {
421     type Error = Error;
422 
next_element_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed<'de>,423     fn next_element_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
424     where
425         K: de::DeserializeSeed<'de>,
426     {
427         assert!(self.next_value.is_none());
428         assert!(self.values.next().is_none());
429 
430         if self.cur_parent == self.max {
431             return Ok(None);
432         }
433 
434         let next = self.tables[..self.max]
435             .iter()
436             .enumerate()
437             .skip(self.cur_parent + 1)
438             .find(|&(_, table)| table.array && table.header == self.tables[self.cur_parent].header)
439             .map(|p| p.0)
440             .unwrap_or(self.max);
441 
442         let ret = seed.deserialize(MapVisitor {
443             values: self.tables[self.cur_parent]
444                 .values
445                 .take()
446                 .expect("Unable to read table values")
447                 .into_iter(),
448             next_value: None,
449             depth: self.depth + 1,
450             cur_parent: self.cur_parent,
451             max: next,
452             cur: 0,
453             array: false,
454             tables: &mut self.tables,
455             de: &mut self.de,
456         })?;
457         self.cur_parent = next;
458         Ok(Some(ret))
459     }
460 }
461 
462 impl<'de, 'b> de::Deserializer<'de> for MapVisitor<'de, 'b> {
463     type Error = Error;
464 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,465     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
466     where
467         V: de::Visitor<'de>,
468     {
469         if self.array {
470             visitor.visit_seq(self)
471         } else {
472             visitor.visit_map(self)
473         }
474     }
475 
476     // `None` is interpreted as a missing field so be sure to implement `Some`
477     // as a present field.
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,478     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
479     where
480         V: de::Visitor<'de>,
481     {
482         visitor.visit_some(self)
483     }
484 
deserialize_newtype_struct<V>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,485     fn deserialize_newtype_struct<V>(
486         self,
487         _name: &'static str,
488         visitor: V,
489     ) -> Result<V::Value, Error>
490     where
491         V: de::Visitor<'de>,
492     {
493         visitor.visit_newtype_struct(self)
494     }
495 
496     serde::forward_to_deserialize_any! {
497         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
498         bytes byte_buf map struct unit identifier
499         ignored_any unit_struct tuple_struct tuple enum
500     }
501 }
502 
503 struct StrDeserializer<'a> {
504     key: Cow<'a, str>,
505 }
506 
507 impl<'a> StrDeserializer<'a> {
new(key: Cow<'a, str>) -> StrDeserializer<'a>508     fn new(key: Cow<'a, str>) -> StrDeserializer<'a> {
509         StrDeserializer { key: key }
510     }
511 }
512 
513 impl<'de> de::Deserializer<'de> for StrDeserializer<'de> {
514     type Error = Error;
515 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,516     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
517     where
518         V: de::Visitor<'de>,
519     {
520         match self.key {
521             Cow::Borrowed(s) => visitor.visit_borrowed_str(s),
522             Cow::Owned(s) => visitor.visit_string(s),
523         }
524     }
525 
526     serde::forward_to_deserialize_any! {
527         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
528         bytes byte_buf map struct option unit newtype_struct
529         ignored_any unit_struct tuple_struct tuple enum identifier
530     }
531 }
532 
533 struct ValueDeserializer<'a> {
534     value: Value<'a>,
535     validate_struct_keys: bool,
536 }
537 
538 impl<'a> ValueDeserializer<'a> {
new(value: Value<'a>) -> ValueDeserializer<'a>539     fn new(value: Value<'a>) -> ValueDeserializer<'a> {
540         ValueDeserializer {
541             value: value,
542             validate_struct_keys: false,
543         }
544     }
545 
with_struct_key_validation(mut self) -> Self546     fn with_struct_key_validation(mut self) -> Self {
547         self.validate_struct_keys = true;
548         self
549     }
550 }
551 
552 impl<'de> de::Deserializer<'de> for ValueDeserializer<'de> {
553     type Error = Error;
554 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,555     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
556     where
557         V: de::Visitor<'de>,
558     {
559         match self.value.e {
560             E::Integer(i) => visitor.visit_i64(i),
561             E::Boolean(b) => visitor.visit_bool(b),
562             E::Float(f) => visitor.visit_f64(f),
563             E::String(Cow::Borrowed(s)) => visitor.visit_borrowed_str(s),
564             E::String(Cow::Owned(s)) => visitor.visit_string(s),
565             E::Datetime(s) => visitor.visit_map(DatetimeDeserializer {
566                 date: s,
567                 visited: false,
568             }),
569             E::Array(values) => {
570                 let mut s = de::value::SeqDeserializer::new(values.into_iter());
571                 let ret = visitor.visit_seq(&mut s)?;
572                 s.end()?;
573                 Ok(ret)
574             }
575             E::InlineTable(values) | E::DottedTable(values) => {
576                 visitor.visit_map(InlineTableDeserializer {
577                     values: values.into_iter(),
578                     next_value: None,
579                 })
580             }
581         }
582     }
583 
deserialize_struct<V>( self, name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,584     fn deserialize_struct<V>(
585         self,
586         name: &'static str,
587         fields: &'static [&'static str],
588         visitor: V,
589     ) -> Result<V::Value, Error>
590     where
591         V: de::Visitor<'de>,
592     {
593         if name == datetime::NAME && fields == &[datetime::FIELD] {
594             if let E::Datetime(s) = self.value.e {
595                 return visitor.visit_map(DatetimeDeserializer {
596                     date: s,
597                     visited: false,
598                 });
599             }
600         }
601 
602         if self.validate_struct_keys {
603             match &self.value.e {
604                 &E::InlineTable(ref values) | &E::DottedTable(ref values) => {
605                     let extra_fields = values
606                         .iter()
607                         .filter_map(|key_value| {
608                             let (ref key, ref _val) = *key_value;
609                             if !fields.contains(&&(**key)) {
610                                 Some(key.clone())
611                             } else {
612                                 None
613                             }
614                         })
615                         .collect::<Vec<Cow<'de, str>>>();
616 
617                     if !extra_fields.is_empty() {
618                         return Err(Error::from_kind(ErrorKind::UnexpectedKeys {
619                             keys: extra_fields
620                                 .iter()
621                                 .map(|k| k.to_string())
622                                 .collect::<Vec<_>>(),
623                             available: fields,
624                         }));
625                     }
626                 }
627                 _ => {}
628             }
629         }
630 
631         if name == spanned::NAME && fields == &[spanned::START, spanned::END, spanned::VALUE] {
632             let start = self.value.start;
633             let end = self.value.end;
634 
635             return visitor.visit_map(SpannedDeserializer {
636                 start: Some(start),
637                 value: Some(self.value),
638                 end: Some(end),
639             });
640         }
641 
642         self.deserialize_any(visitor)
643     }
644 
645     // `None` is interpreted as a missing field so be sure to implement `Some`
646     // as a present field.
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,647     fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
648     where
649         V: de::Visitor<'de>,
650     {
651         visitor.visit_some(self)
652     }
653 
deserialize_enum<V>( self, _name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,654     fn deserialize_enum<V>(
655         self,
656         _name: &'static str,
657         _variants: &'static [&'static str],
658         visitor: V,
659     ) -> Result<V::Value, Error>
660     where
661         V: de::Visitor<'de>,
662     {
663         match self.value.e {
664             E::String(val) => visitor.visit_enum(val.into_deserializer()),
665             E::InlineTable(values) => {
666                 if values.len() != 1 {
667                     Err(Error::from_kind(ErrorKind::Wanted {
668                         expected: "exactly 1 element",
669                         found: if values.is_empty() {
670                             "zero elements"
671                         } else {
672                             "more than 1 element"
673                         },
674                     }))
675                 } else {
676                     visitor.visit_enum(InlineTableDeserializer {
677                         values: values.into_iter(),
678                         next_value: None,
679                     })
680                 }
681             }
682             e @ _ => Err(Error::from_kind(ErrorKind::Wanted {
683                 expected: "string or inline table",
684                 found: e.type_name(),
685             })),
686         }
687     }
688 
deserialize_newtype_struct<V>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: de::Visitor<'de>,689     fn deserialize_newtype_struct<V>(
690         self,
691         _name: &'static str,
692         visitor: V,
693     ) -> Result<V::Value, Error>
694     where
695         V: de::Visitor<'de>,
696     {
697         visitor.visit_newtype_struct(self)
698     }
699 
700     serde::forward_to_deserialize_any! {
701         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
702         bytes byte_buf map unit identifier
703         ignored_any unit_struct tuple_struct tuple
704     }
705 }
706 
707 impl<'de> de::IntoDeserializer<'de, Error> for Value<'de> {
708     type Deserializer = ValueDeserializer<'de>;
709 
into_deserializer(self) -> Self::Deserializer710     fn into_deserializer(self) -> Self::Deserializer {
711         ValueDeserializer::new(self)
712     }
713 }
714 
715 struct SpannedDeserializer<'a> {
716     start: Option<usize>,
717     end: Option<usize>,
718     value: Option<Value<'a>>,
719 }
720 
721 impl<'de> de::MapAccess<'de> for SpannedDeserializer<'de> {
722     type Error = Error;
723 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed<'de>,724     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
725     where
726         K: de::DeserializeSeed<'de>,
727     {
728         if self.start.is_some() {
729             seed.deserialize(BorrowedStrDeserializer::new(spanned::START))
730                 .map(Some)
731         } else if self.end.is_some() {
732             seed.deserialize(BorrowedStrDeserializer::new(spanned::END))
733                 .map(Some)
734         } else if self.value.is_some() {
735             seed.deserialize(BorrowedStrDeserializer::new(spanned::VALUE))
736                 .map(Some)
737         } else {
738             Ok(None)
739         }
740     }
741 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: de::DeserializeSeed<'de>,742     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
743     where
744         V: de::DeserializeSeed<'de>,
745     {
746         if let Some(start) = self.start.take() {
747             seed.deserialize(start.into_deserializer())
748         } else if let Some(end) = self.end.take() {
749             seed.deserialize(end.into_deserializer())
750         } else if let Some(value) = self.value.take() {
751             seed.deserialize(value.into_deserializer())
752         } else {
753             panic!("next_value_seed called before next_key_seed")
754         }
755     }
756 }
757 
758 struct DatetimeDeserializer<'a> {
759     visited: bool,
760     date: &'a str,
761 }
762 
763 impl<'de> de::MapAccess<'de> for DatetimeDeserializer<'de> {
764     type Error = Error;
765 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed<'de>,766     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
767     where
768         K: de::DeserializeSeed<'de>,
769     {
770         if self.visited {
771             return Ok(None);
772         }
773         self.visited = true;
774         seed.deserialize(DatetimeFieldDeserializer).map(Some)
775     }
776 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: de::DeserializeSeed<'de>,777     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
778     where
779         V: de::DeserializeSeed<'de>,
780     {
781         seed.deserialize(StrDeserializer::new(self.date.into()))
782     }
783 }
784 
785 struct DatetimeFieldDeserializer;
786 
787 impl<'de> de::Deserializer<'de> for DatetimeFieldDeserializer {
788     type Error = Error;
789 
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: de::Visitor<'de>,790     fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
791     where
792         V: de::Visitor<'de>,
793     {
794         visitor.visit_borrowed_str(datetime::FIELD)
795     }
796 
797     serde::forward_to_deserialize_any! {
798         bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string seq
799         bytes byte_buf map struct option unit newtype_struct
800         ignored_any unit_struct tuple_struct tuple enum identifier
801     }
802 }
803 
804 struct DottedTableDeserializer<'a> {
805     name: Cow<'a, str>,
806     value: Value<'a>,
807 }
808 
809 impl<'de> de::EnumAccess<'de> for DottedTableDeserializer<'de> {
810     type Error = Error;
811     type Variant = TableEnumDeserializer<'de>;
812 
variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: de::DeserializeSeed<'de>,813     fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
814     where
815         V: de::DeserializeSeed<'de>,
816     {
817         let (name, value) = (self.name, self.value);
818         seed.deserialize(StrDeserializer::new(name))
819             .map(|val| (val, TableEnumDeserializer { value: value }))
820     }
821 }
822 
823 struct InlineTableDeserializer<'a> {
824     values: vec::IntoIter<(Cow<'a, str>, Value<'a>)>,
825     next_value: Option<Value<'a>>,
826 }
827 
828 impl<'de> de::MapAccess<'de> for InlineTableDeserializer<'de> {
829     type Error = Error;
830 
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: de::DeserializeSeed<'de>,831     fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
832     where
833         K: de::DeserializeSeed<'de>,
834     {
835         let (key, value) = match self.values.next() {
836             Some(pair) => pair,
837             None => return Ok(None),
838         };
839         self.next_value = Some(value);
840         seed.deserialize(StrDeserializer::new(key)).map(Some)
841     }
842 
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: de::DeserializeSeed<'de>,843     fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
844     where
845         V: de::DeserializeSeed<'de>,
846     {
847         let value = self.next_value.take().expect("Unable to read table values");
848         seed.deserialize(ValueDeserializer::new(value))
849     }
850 }
851 
852 impl<'de> de::EnumAccess<'de> for InlineTableDeserializer<'de> {
853     type Error = Error;
854     type Variant = TableEnumDeserializer<'de>;
855 
variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: de::DeserializeSeed<'de>,856     fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
857     where
858         V: de::DeserializeSeed<'de>,
859     {
860         let (key, value) = match self.values.next() {
861             Some(pair) => pair,
862             None => {
863                 return Err(Error::from_kind(ErrorKind::Wanted {
864                     expected: "table with exactly 1 entry",
865                     found: "empty table",
866                 }))
867             }
868         };
869 
870         seed.deserialize(StrDeserializer::new(key))
871             .map(|val| (val, TableEnumDeserializer { value: value }))
872     }
873 }
874 
875 /// Deserializes table values into enum variants.
876 struct TableEnumDeserializer<'a> {
877     value: Value<'a>,
878 }
879 
880 impl<'de> de::VariantAccess<'de> for TableEnumDeserializer<'de> {
881     type Error = Error;
882 
unit_variant(self) -> Result<(), Self::Error>883     fn unit_variant(self) -> Result<(), Self::Error> {
884         match self.value.e {
885             E::InlineTable(values) | E::DottedTable(values) => {
886                 if values.len() == 0 {
887                     Ok(())
888                 } else {
889                     Err(Error::from_kind(ErrorKind::ExpectedEmptyTable))
890                 }
891             }
892             e @ _ => Err(Error::from_kind(ErrorKind::Wanted {
893                 expected: "table",
894                 found: e.type_name(),
895             })),
896         }
897     }
898 
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error> where T: de::DeserializeSeed<'de>,899     fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
900     where
901         T: de::DeserializeSeed<'de>,
902     {
903         seed.deserialize(ValueDeserializer::new(self.value))
904     }
905 
tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,906     fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
907     where
908         V: de::Visitor<'de>,
909     {
910         match self.value.e {
911             E::InlineTable(values) | E::DottedTable(values) => {
912                 let tuple_values = values
913                     .into_iter()
914                     .enumerate()
915                     .map(|(index, (key, value))| match key.parse::<usize>() {
916                         Ok(key_index) if key_index == index => Ok(value),
917                         Ok(_) | Err(_) => Err(Error::from_kind(ErrorKind::ExpectedTupleIndex {
918                             expected: index,
919                             found: key.to_string(),
920                         })),
921                     })
922                     // Fold all values into a `Vec`, or return the first error.
923                     .fold(Ok(Vec::with_capacity(len)), |result, value_result| {
924                         result.and_then(move |mut tuple_values| match value_result {
925                             Ok(value) => {
926                                 tuple_values.push(value);
927                                 Ok(tuple_values)
928                             }
929                             // `Result<de::Value, Self::Error>` to `Result<Vec<_>, Self::Error>`
930                             Err(e) => Err(e),
931                         })
932                     })?;
933 
934                 if tuple_values.len() == len {
935                     de::Deserializer::deserialize_seq(
936                         ValueDeserializer::new(Value {
937                             e: E::Array(tuple_values),
938                             start: self.value.start,
939                             end: self.value.end,
940                         }),
941                         visitor,
942                     )
943                 } else {
944                     Err(Error::from_kind(ErrorKind::ExpectedTuple(len)))
945                 }
946             }
947             e @ _ => Err(Error::from_kind(ErrorKind::Wanted {
948                 expected: "table",
949                 found: e.type_name(),
950             })),
951         }
952     }
953 
struct_variant<V>( self, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,954     fn struct_variant<V>(
955         self,
956         fields: &'static [&'static str],
957         visitor: V,
958     ) -> Result<V::Value, Self::Error>
959     where
960         V: de::Visitor<'de>,
961     {
962         de::Deserializer::deserialize_struct(
963             ValueDeserializer::new(self.value).with_struct_key_validation(),
964             "", // TODO: this should be the variant name
965             fields,
966             visitor,
967         )
968     }
969 }
970 
971 impl<'a> Deserializer<'a> {
972     /// Creates a new deserializer which will be deserializing the string
973     /// provided.
new(input: &'a str) -> Deserializer<'a>974     pub fn new(input: &'a str) -> Deserializer<'a> {
975         Deserializer {
976             tokens: Tokenizer::new(input),
977             input: input,
978             require_newline_after_table: true,
979             allow_duplciate_after_longer_table: false,
980         }
981     }
982 
983     /// The `Deserializer::end` method should be called after a value has been
984     /// fully deserialized.  This allows the `Deserializer` to validate that the
985     /// input stream is at the end or that it only has trailing
986     /// whitespace/comments.
end(&mut self) -> Result<(), Error>987     pub fn end(&mut self) -> Result<(), Error> {
988         Ok(())
989     }
990 
991     /// Historical versions of toml-rs accidentally allowed a newline after a
992     /// table definition, but the TOML spec requires a newline after a table
993     /// definition header.
994     ///
995     /// This option can be set to `false` (the default is `true`) to emulate
996     /// this behavior for backwards compatibility with older toml-rs versions.
set_require_newline_after_table(&mut self, require: bool)997     pub fn set_require_newline_after_table(&mut self, require: bool) {
998         self.require_newline_after_table = require;
999     }
1000 
1001     /// Historical versions of toml-rs accidentally allowed a duplicate table
1002     /// header after a longer table header was previously defined. This is
1003     /// invalid according to the TOML spec, however.
1004     ///
1005     /// This option can be set to `true` (the default is `false`) to emulate
1006     /// this behavior for backwards compatibility with older toml-rs versions.
set_allow_duplicate_after_longer_table(&mut self, allow: bool)1007     pub fn set_allow_duplicate_after_longer_table(&mut self, allow: bool) {
1008         self.allow_duplciate_after_longer_table = allow;
1009     }
1010 
tables(&mut self) -> Result<Vec<Table<'a>>, Error>1011     fn tables(&mut self) -> Result<Vec<Table<'a>>, Error> {
1012         let mut tables = Vec::new();
1013         let mut cur_table = Table {
1014             at: 0,
1015             header: Vec::new(),
1016             values: None,
1017             array: false,
1018         };
1019 
1020         while let Some(line) = self.line()? {
1021             match line {
1022                 Line::Table {
1023                     at,
1024                     mut header,
1025                     array,
1026                 } => {
1027                     if !cur_table.header.is_empty() || cur_table.values.is_some() {
1028                         tables.push(cur_table);
1029                     }
1030                     cur_table = Table {
1031                         at: at,
1032                         header: Vec::new(),
1033                         values: Some(Vec::new()),
1034                         array: array,
1035                     };
1036                     loop {
1037                         let part = header.next().map_err(|e| self.token_error(e));
1038                         match part? {
1039                             Some(part) => cur_table.header.push(part),
1040                             None => break,
1041                         }
1042                     }
1043                 }
1044                 Line::KeyValue(key, value) => {
1045                     if cur_table.values.is_none() {
1046                         cur_table.values = Some(Vec::new());
1047                     }
1048                     self.add_dotted_key(key, value, cur_table.values.as_mut().unwrap())?;
1049                 }
1050             }
1051         }
1052         if !cur_table.header.is_empty() || cur_table.values.is_some() {
1053             tables.push(cur_table);
1054         }
1055         Ok(tables)
1056     }
1057 
line(&mut self) -> Result<Option<Line<'a>>, Error>1058     fn line(&mut self) -> Result<Option<Line<'a>>, Error> {
1059         loop {
1060             self.eat_whitespace()?;
1061             if self.eat_comment()? {
1062                 continue;
1063             }
1064             if self.eat(Token::Newline)? {
1065                 continue;
1066             }
1067             break;
1068         }
1069 
1070         match self.peek()? {
1071             Some((_, Token::LeftBracket)) => self.table_header().map(Some),
1072             Some(_) => self.key_value().map(Some),
1073             None => Ok(None),
1074         }
1075     }
1076 
table_header(&mut self) -> Result<Line<'a>, Error>1077     fn table_header(&mut self) -> Result<Line<'a>, Error> {
1078         let start = self.tokens.current();
1079         self.expect(Token::LeftBracket)?;
1080         let array = self.eat(Token::LeftBracket)?;
1081         let ret = Header::new(self.tokens.clone(), array, self.require_newline_after_table);
1082         if self.require_newline_after_table {
1083             self.tokens.skip_to_newline();
1084         } else {
1085             loop {
1086                 match self.next()? {
1087                     Some((_, Token::RightBracket)) => {
1088                         if array {
1089                             self.eat(Token::RightBracket)?;
1090                         }
1091                         break;
1092                     }
1093                     Some((_, Token::Newline)) | None => break,
1094                     _ => {}
1095                 }
1096             }
1097             self.eat_whitespace()?;
1098         }
1099         Ok(Line::Table {
1100             at: start,
1101             header: ret,
1102             array: array,
1103         })
1104     }
1105 
key_value(&mut self) -> Result<Line<'a>, Error>1106     fn key_value(&mut self) -> Result<Line<'a>, Error> {
1107         let key = self.dotted_key()?;
1108         self.eat_whitespace()?;
1109         self.expect(Token::Equals)?;
1110         self.eat_whitespace()?;
1111 
1112         let value = self.value()?;
1113         self.eat_whitespace()?;
1114         if !self.eat_comment()? {
1115             self.eat_newline_or_eof()?;
1116         }
1117 
1118         Ok(Line::KeyValue(key, value))
1119     }
1120 
value(&mut self) -> Result<Value<'a>, Error>1121     fn value(&mut self) -> Result<Value<'a>, Error> {
1122         let at = self.tokens.current();
1123         let value = match self.next()? {
1124             Some((Span { start, end }, Token::String { val, .. })) => Value {
1125                 e: E::String(val),
1126                 start: start,
1127                 end: end,
1128             },
1129             Some((Span { start, end }, Token::Keylike("true"))) => Value {
1130                 e: E::Boolean(true),
1131                 start: start,
1132                 end: end,
1133             },
1134             Some((Span { start, end }, Token::Keylike("false"))) => Value {
1135                 e: E::Boolean(false),
1136                 start: start,
1137                 end: end,
1138             },
1139             Some((span, Token::Keylike(key))) => self.number_or_date(span, key)?,
1140             Some((span, Token::Plus)) => self.number_leading_plus(span)?,
1141             Some((Span { start, .. }, Token::LeftBrace)) => {
1142                 self.inline_table().map(|(Span { end, .. }, table)| Value {
1143                     e: E::InlineTable(table),
1144                     start: start,
1145                     end: end,
1146                 })?
1147             }
1148             Some((Span { start, .. }, Token::LeftBracket)) => {
1149                 self.array().map(|(Span { end, .. }, array)| Value {
1150                     e: E::Array(array),
1151                     start: start,
1152                     end: end,
1153                 })?
1154             }
1155             Some(token) => {
1156                 return Err(self.error(
1157                     at,
1158                     ErrorKind::Wanted {
1159                         expected: "a value",
1160                         found: token.1.describe(),
1161                     },
1162                 ))
1163             }
1164             None => return Err(self.eof()),
1165         };
1166         Ok(value)
1167     }
1168 
number_or_date(&mut self, span: Span, s: &'a str) -> Result<Value<'a>, Error>1169     fn number_or_date(&mut self, span: Span, s: &'a str) -> Result<Value<'a>, Error> {
1170         if s.contains('T')
1171             || s.contains('t')
1172             || (s.len() > 1 && s[1..].contains('-') && !s.contains("e-") && !s.contains("E-"))
1173         {
1174             self.datetime(span, s, false)
1175                 .map(|(Span { start, end }, d)| Value {
1176                     e: E::Datetime(d),
1177                     start: start,
1178                     end: end,
1179                 })
1180         } else if self.eat(Token::Colon)? {
1181             self.datetime(span, s, true)
1182                 .map(|(Span { start, end }, d)| Value {
1183                     e: E::Datetime(d),
1184                     start: start,
1185                     end: end,
1186                 })
1187         } else {
1188             self.number(span, s)
1189         }
1190     }
1191 
1192     /// Returns a string or table value type.
1193     ///
1194     /// Used to deserialize enums. Unit enums may be represented as a string or a table, all other
1195     /// structures (tuple, newtype, struct) must be represented as a table.
string_or_table(&mut self) -> Result<(Value<'a>, Option<Cow<'a, str>>), Error>1196     fn string_or_table(&mut self) -> Result<(Value<'a>, Option<Cow<'a, str>>), Error> {
1197         match self.peek()? {
1198             Some((_, Token::LeftBracket)) => {
1199                 let tables = self.tables()?;
1200                 if tables.len() != 1 {
1201                     return Err(Error::from_kind(ErrorKind::Wanted {
1202                         expected: "exactly 1 table",
1203                         found: if tables.is_empty() {
1204                             "zero tables"
1205                         } else {
1206                             "more than 1 table"
1207                         },
1208                     }));
1209                 }
1210 
1211                 let table = tables
1212                     .into_iter()
1213                     .next()
1214                     .expect("Expected exactly one table");
1215                 let header = table
1216                     .header
1217                     .last()
1218                     .expect("Expected at least one header value for table.");
1219 
1220                 let start = table.at;
1221                 let end = table
1222                     .values
1223                     .as_ref()
1224                     .and_then(|values| values.last())
1225                     .map(|&(_, ref val)| val.end)
1226                     .unwrap_or_else(|| header.len());
1227                 Ok((
1228                     Value {
1229                         e: E::DottedTable(table.values.unwrap_or_else(Vec::new)),
1230                         start: start,
1231                         end: end,
1232                     },
1233                     Some(header.clone()),
1234                 ))
1235             }
1236             Some(_) => self.value().map(|val| (val, None)),
1237             None => Err(self.eof()),
1238         }
1239     }
1240 
1241     fn number(&mut self, Span { start, end }: Span, s: &'a str) -> Result<Value<'a>, Error> {
1242         let to_integer = |f| Value {
1243             e: E::Integer(f),
1244             start: start,
1245             end: end,
1246         };
1247         if s.starts_with("0x") {
1248             self.integer(&s[2..], 16).map(to_integer)
1249         } else if s.starts_with("0o") {
1250             self.integer(&s[2..], 8).map(to_integer)
1251         } else if s.starts_with("0b") {
1252             self.integer(&s[2..], 2).map(to_integer)
1253         } else if s.contains('e') || s.contains('E') {
1254             self.float(s, None).map(|f| Value {
1255                 e: E::Float(f),
1256                 start: start,
1257                 end: end,
1258             })
1259         } else if self.eat(Token::Period)? {
1260             let at = self.tokens.current();
1261             match self.next()? {
1262                 Some((Span { start, end }, Token::Keylike(after))) => {
1263                     self.float(s, Some(after)).map(|f| Value {
1264                         e: E::Float(f),
1265                         start: start,
1266                         end: end,
1267                     })
1268                 }
1269                 _ => Err(self.error(at, ErrorKind::NumberInvalid)),
1270             }
1271         } else if s == "inf" {
1272             Ok(Value {
1273                 e: E::Float(f64::INFINITY),
1274                 start: start,
1275                 end: end,
1276             })
1277         } else if s == "-inf" {
1278             Ok(Value {
1279                 e: E::Float(f64::NEG_INFINITY),
1280                 start: start,
1281                 end: end,
1282             })
1283         } else if s == "nan" {
1284             Ok(Value {
1285                 e: E::Float(f64::NAN),
1286                 start: start,
1287                 end: end,
1288             })
1289         } else if s == "-nan" {
1290             Ok(Value {
1291                 e: E::Float(-f64::NAN),
1292                 start: start,
1293                 end: end,
1294             })
1295         } else {
1296             self.integer(s, 10).map(to_integer)
1297         }
1298     }
1299 
1300     fn number_leading_plus(&mut self, Span { start, .. }: Span) -> Result<Value<'a>, Error> {
1301         let start_token = self.tokens.current();
1302         match self.next()? {
1303             Some((Span { end, .. }, Token::Keylike(s))) => self.number(
1304                 Span {
1305                     start: start,
1306                     end: end,
1307                 },
1308                 s,
1309             ),
1310             _ => Err(self.error(start_token, ErrorKind::NumberInvalid)),
1311         }
1312     }
1313 
integer(&self, s: &'a str, radix: u32) -> Result<i64, Error>1314     fn integer(&self, s: &'a str, radix: u32) -> Result<i64, Error> {
1315         let allow_sign = radix == 10;
1316         let allow_leading_zeros = radix != 10;
1317         let (prefix, suffix) = self.parse_integer(s, allow_sign, allow_leading_zeros, radix)?;
1318         let start = self.tokens.substr_offset(s);
1319         if suffix != "" {
1320             return Err(self.error(start, ErrorKind::NumberInvalid));
1321         }
1322         i64::from_str_radix(&prefix.replace("_", "").trim_start_matches('+'), radix)
1323             .map_err(|_e| self.error(start, ErrorKind::NumberInvalid))
1324     }
1325 
parse_integer( &self, s: &'a str, allow_sign: bool, allow_leading_zeros: bool, radix: u32, ) -> Result<(&'a str, &'a str), Error>1326     fn parse_integer(
1327         &self,
1328         s: &'a str,
1329         allow_sign: bool,
1330         allow_leading_zeros: bool,
1331         radix: u32,
1332     ) -> Result<(&'a str, &'a str), Error> {
1333         let start = self.tokens.substr_offset(s);
1334 
1335         let mut first = true;
1336         let mut first_zero = false;
1337         let mut underscore = false;
1338         let mut end = s.len();
1339         for (i, c) in s.char_indices() {
1340             let at = i + start;
1341             if i == 0 && (c == '+' || c == '-') && allow_sign {
1342                 continue;
1343             }
1344 
1345             if c == '0' && first {
1346                 first_zero = true;
1347             } else if c.to_digit(radix).is_some() {
1348                 if !first && first_zero && !allow_leading_zeros {
1349                     return Err(self.error(at, ErrorKind::NumberInvalid));
1350                 }
1351                 underscore = false;
1352             } else if c == '_' && first {
1353                 return Err(self.error(at, ErrorKind::NumberInvalid));
1354             } else if c == '_' && !underscore {
1355                 underscore = true;
1356             } else {
1357                 end = i;
1358                 break;
1359             }
1360             first = false;
1361         }
1362         if first || underscore {
1363             return Err(self.error(start, ErrorKind::NumberInvalid));
1364         }
1365         Ok((&s[..end], &s[end..]))
1366     }
1367 
float(&mut self, s: &'a str, after_decimal: Option<&'a str>) -> Result<f64, Error>1368     fn float(&mut self, s: &'a str, after_decimal: Option<&'a str>) -> Result<f64, Error> {
1369         let (integral, mut suffix) = self.parse_integer(s, true, false, 10)?;
1370         let start = self.tokens.substr_offset(integral);
1371 
1372         let mut fraction = None;
1373         if let Some(after) = after_decimal {
1374             if suffix != "" {
1375                 return Err(self.error(start, ErrorKind::NumberInvalid));
1376             }
1377             let (a, b) = self.parse_integer(after, false, true, 10)?;
1378             fraction = Some(a);
1379             suffix = b;
1380         }
1381 
1382         let mut exponent = None;
1383         if suffix.starts_with('e') || suffix.starts_with('E') {
1384             let (a, b) = if suffix.len() == 1 {
1385                 self.eat(Token::Plus)?;
1386                 match self.next()? {
1387                     Some((_, Token::Keylike(s))) => self.parse_integer(s, false, false, 10)?,
1388                     _ => return Err(self.error(start, ErrorKind::NumberInvalid)),
1389                 }
1390             } else {
1391                 self.parse_integer(&suffix[1..], true, false, 10)?
1392             };
1393             if b != "" {
1394                 return Err(self.error(start, ErrorKind::NumberInvalid));
1395             }
1396             exponent = Some(a);
1397         } else if !suffix.is_empty() {
1398             return Err(self.error(start, ErrorKind::NumberInvalid));
1399         }
1400 
1401         let mut number = integral
1402             .trim_start_matches('+')
1403             .chars()
1404             .filter(|c| *c != '_')
1405             .collect::<String>();
1406         if let Some(fraction) = fraction {
1407             number.push_str(".");
1408             number.extend(fraction.chars().filter(|c| *c != '_'));
1409         }
1410         if let Some(exponent) = exponent {
1411             number.push_str("E");
1412             number.extend(exponent.chars().filter(|c| *c != '_'));
1413         }
1414         number
1415             .parse()
1416             .map_err(|_e| self.error(start, ErrorKind::NumberInvalid))
1417             .and_then(|n: f64| {
1418                 if n.is_finite() {
1419                     Ok(n)
1420                 } else {
1421                     Err(self.error(start, ErrorKind::NumberInvalid))
1422                 }
1423             })
1424     }
1425 
datetime( &mut self, mut span: Span, date: &'a str, colon_eaten: bool, ) -> Result<(Span, &'a str), Error>1426     fn datetime(
1427         &mut self,
1428         mut span: Span,
1429         date: &'a str,
1430         colon_eaten: bool,
1431     ) -> Result<(Span, &'a str), Error> {
1432         let start = self.tokens.substr_offset(date);
1433 
1434         // Check for space separated date and time.
1435         let mut lookahead = self.tokens.clone();
1436         if let Ok(Some((_, Token::Whitespace(" ")))) = lookahead.next() {
1437             // Check if hour follows.
1438             if let Ok(Some((_, Token::Keylike(_)))) = lookahead.next() {
1439                 self.next()?; // skip space
1440                 self.next()?; // skip keylike hour
1441             }
1442         }
1443 
1444         if colon_eaten || self.eat(Token::Colon)? {
1445             // minutes
1446             match self.next()? {
1447                 Some((_, Token::Keylike(_))) => {}
1448                 _ => return Err(self.error(start, ErrorKind::DateInvalid)),
1449             }
1450             // Seconds
1451             self.expect(Token::Colon)?;
1452             match self.next()? {
1453                 Some((Span { end, .. }, Token::Keylike(_))) => {
1454                     span.end = end;
1455                 }
1456                 _ => return Err(self.error(start, ErrorKind::DateInvalid)),
1457             }
1458             // Fractional seconds
1459             if self.eat(Token::Period)? {
1460                 match self.next()? {
1461                     Some((Span { end, .. }, Token::Keylike(_))) => {
1462                         span.end = end;
1463                     }
1464                     _ => return Err(self.error(start, ErrorKind::DateInvalid)),
1465                 }
1466             }
1467 
1468             // offset
1469             if self.eat(Token::Plus)? {
1470                 match self.next()? {
1471                     Some((Span { end, .. }, Token::Keylike(_))) => {
1472                         span.end = end;
1473                     }
1474                     _ => return Err(self.error(start, ErrorKind::DateInvalid)),
1475                 }
1476             }
1477             if self.eat(Token::Colon)? {
1478                 match self.next()? {
1479                     Some((Span { end, .. }, Token::Keylike(_))) => {
1480                         span.end = end;
1481                     }
1482                     _ => return Err(self.error(start, ErrorKind::DateInvalid)),
1483                 }
1484             }
1485         }
1486 
1487         let end = self.tokens.current();
1488         Ok((span, &self.tokens.input()[start..end]))
1489     }
1490 
1491     // TODO(#140): shouldn't buffer up this entire table in memory, it'd be
1492     // great to defer parsing everything until later.
inline_table(&mut self) -> Result<(Span, Vec<(Cow<'a, str>, Value<'a>)>), Error>1493     fn inline_table(&mut self) -> Result<(Span, Vec<(Cow<'a, str>, Value<'a>)>), Error> {
1494         let mut ret = Vec::new();
1495         self.eat_whitespace()?;
1496         if let Some(span) = self.eat_spanned(Token::RightBrace)? {
1497             return Ok((span, ret));
1498         }
1499         loop {
1500             let key = self.dotted_key()?;
1501             self.eat_whitespace()?;
1502             self.expect(Token::Equals)?;
1503             self.eat_whitespace()?;
1504             let value = self.value()?;
1505             self.add_dotted_key(key, value, &mut ret)?;
1506 
1507             self.eat_whitespace()?;
1508             if let Some(span) = self.eat_spanned(Token::RightBrace)? {
1509                 return Ok((span, ret));
1510             }
1511             self.expect(Token::Comma)?;
1512             self.eat_whitespace()?;
1513         }
1514     }
1515 
1516     // TODO(#140): shouldn't buffer up this entire array in memory, it'd be
1517     // great to defer parsing everything until later.
array(&mut self) -> Result<(Span, Vec<Value<'a>>), Error>1518     fn array(&mut self) -> Result<(Span, Vec<Value<'a>>), Error> {
1519         let mut ret = Vec::new();
1520 
1521         let intermediate = |me: &mut Deserializer<'_>| {
1522             loop {
1523                 me.eat_whitespace()?;
1524                 if !me.eat(Token::Newline)? && !me.eat_comment()? {
1525                     break;
1526                 }
1527             }
1528             Ok(())
1529         };
1530 
1531         loop {
1532             intermediate(self)?;
1533             if let Some(span) = self.eat_spanned(Token::RightBracket)? {
1534                 return Ok((span, ret));
1535             }
1536             let at = self.tokens.current();
1537             let value = self.value()?;
1538             if let Some(last) = ret.last() {
1539                 if !value.same_type(last) {
1540                     return Err(self.error(at, ErrorKind::MixedArrayType));
1541                 }
1542             }
1543             ret.push(value);
1544             intermediate(self)?;
1545             if !self.eat(Token::Comma)? {
1546                 break;
1547             }
1548         }
1549         intermediate(self)?;
1550         let span = self.expect_spanned(Token::RightBracket)?;
1551         Ok((span, ret))
1552     }
1553 
table_key(&mut self) -> Result<Cow<'a, str>, Error>1554     fn table_key(&mut self) -> Result<Cow<'a, str>, Error> {
1555         self.tokens
1556             .table_key()
1557             .map(|t| t.1)
1558             .map_err(|e| self.token_error(e))
1559     }
1560 
dotted_key(&mut self) -> Result<Vec<Cow<'a, str>>, Error>1561     fn dotted_key(&mut self) -> Result<Vec<Cow<'a, str>>, Error> {
1562         let mut result = Vec::new();
1563         result.push(self.table_key()?);
1564         self.eat_whitespace()?;
1565         while self.eat(Token::Period)? {
1566             self.eat_whitespace()?;
1567             result.push(self.table_key()?);
1568             self.eat_whitespace()?;
1569         }
1570         Ok(result)
1571     }
1572 
1573     /// Stores a value in the appropriate hierachical structure positioned based on the dotted key.
1574     ///
1575     /// Given the following definition: `multi.part.key = "value"`, `multi` and `part` are
1576     /// intermediate parts which are mapped to the relevant fields in the deserialized type's data
1577     /// hierarchy.
1578     ///
1579     /// # Parameters
1580     ///
1581     /// * `key_parts`: Each segment of the dotted key, e.g. `part.one` maps to
1582     ///                `vec![Cow::Borrowed("part"), Cow::Borrowed("one")].`
1583     /// * `value`: The parsed value.
1584     /// * `values`: The `Vec` to store the value in.
add_dotted_key( &self, mut key_parts: Vec<Cow<'a, str>>, value: Value<'a>, values: &mut Vec<(Cow<'a, str>, Value<'a>)>, ) -> Result<(), Error>1585     fn add_dotted_key(
1586         &self,
1587         mut key_parts: Vec<Cow<'a, str>>,
1588         value: Value<'a>,
1589         values: &mut Vec<(Cow<'a, str>, Value<'a>)>,
1590     ) -> Result<(), Error> {
1591         let key = key_parts.remove(0);
1592         if key_parts.is_empty() {
1593             values.push((key, value));
1594             return Ok(());
1595         }
1596         match values.iter_mut().find(|&&mut (ref k, _)| *k == key) {
1597             Some(&mut (
1598                 _,
1599                 Value {
1600                     e: E::DottedTable(ref mut v),
1601                     ..
1602                 },
1603             )) => {
1604                 return self.add_dotted_key(key_parts, value, v);
1605             }
1606             Some(&mut (_, Value { start, .. })) => {
1607                 return Err(self.error(start, ErrorKind::DottedKeyInvalidType));
1608             }
1609             None => {}
1610         }
1611         // The start/end value is somewhat misleading here.
1612         let table_values = Value {
1613             e: E::DottedTable(Vec::new()),
1614             start: value.start,
1615             end: value.end,
1616         };
1617         values.push((key, table_values));
1618         let last_i = values.len() - 1;
1619         if let (
1620             _,
1621             Value {
1622                 e: E::DottedTable(ref mut v),
1623                 ..
1624             },
1625         ) = values[last_i]
1626         {
1627             self.add_dotted_key(key_parts, value, v)?;
1628         }
1629         Ok(())
1630     }
1631 
eat_whitespace(&mut self) -> Result<(), Error>1632     fn eat_whitespace(&mut self) -> Result<(), Error> {
1633         self.tokens
1634             .eat_whitespace()
1635             .map_err(|e| self.token_error(e))
1636     }
1637 
eat_comment(&mut self) -> Result<bool, Error>1638     fn eat_comment(&mut self) -> Result<bool, Error> {
1639         self.tokens.eat_comment().map_err(|e| self.token_error(e))
1640     }
1641 
eat_newline_or_eof(&mut self) -> Result<(), Error>1642     fn eat_newline_or_eof(&mut self) -> Result<(), Error> {
1643         self.tokens
1644             .eat_newline_or_eof()
1645             .map_err(|e| self.token_error(e))
1646     }
1647 
eat(&mut self, expected: Token<'a>) -> Result<bool, Error>1648     fn eat(&mut self, expected: Token<'a>) -> Result<bool, Error> {
1649         self.tokens.eat(expected).map_err(|e| self.token_error(e))
1650     }
1651 
eat_spanned(&mut self, expected: Token<'a>) -> Result<Option<Span>, Error>1652     fn eat_spanned(&mut self, expected: Token<'a>) -> Result<Option<Span>, Error> {
1653         self.tokens
1654             .eat_spanned(expected)
1655             .map_err(|e| self.token_error(e))
1656     }
1657 
expect(&mut self, expected: Token<'a>) -> Result<(), Error>1658     fn expect(&mut self, expected: Token<'a>) -> Result<(), Error> {
1659         self.tokens
1660             .expect(expected)
1661             .map_err(|e| self.token_error(e))
1662     }
1663 
expect_spanned(&mut self, expected: Token<'a>) -> Result<Span, Error>1664     fn expect_spanned(&mut self, expected: Token<'a>) -> Result<Span, Error> {
1665         self.tokens
1666             .expect_spanned(expected)
1667             .map_err(|e| self.token_error(e))
1668     }
1669 
next(&mut self) -> Result<Option<(Span, Token<'a>)>, Error>1670     fn next(&mut self) -> Result<Option<(Span, Token<'a>)>, Error> {
1671         self.tokens.next().map_err(|e| self.token_error(e))
1672     }
1673 
peek(&mut self) -> Result<Option<(Span, Token<'a>)>, Error>1674     fn peek(&mut self) -> Result<Option<(Span, Token<'a>)>, Error> {
1675         self.tokens.peek().map_err(|e| self.token_error(e))
1676     }
1677 
eof(&self) -> Error1678     fn eof(&self) -> Error {
1679         self.error(self.input.len(), ErrorKind::UnexpectedEof)
1680     }
1681 
token_error(&self, error: TokenError) -> Error1682     fn token_error(&self, error: TokenError) -> Error {
1683         match error {
1684             TokenError::InvalidCharInString(at, ch) => {
1685                 self.error(at, ErrorKind::InvalidCharInString(ch))
1686             }
1687             TokenError::InvalidEscape(at, ch) => self.error(at, ErrorKind::InvalidEscape(ch)),
1688             TokenError::InvalidEscapeValue(at, v) => {
1689                 self.error(at, ErrorKind::InvalidEscapeValue(v))
1690             }
1691             TokenError::InvalidHexEscape(at, ch) => self.error(at, ErrorKind::InvalidHexEscape(ch)),
1692             TokenError::NewlineInString(at) => self.error(at, ErrorKind::NewlineInString),
1693             TokenError::Unexpected(at, ch) => self.error(at, ErrorKind::Unexpected(ch)),
1694             TokenError::UnterminatedString(at) => self.error(at, ErrorKind::UnterminatedString),
1695             TokenError::NewlineInTableKey(at) => self.error(at, ErrorKind::NewlineInTableKey),
1696             TokenError::Wanted {
1697                 at,
1698                 expected,
1699                 found,
1700             } => self.error(
1701                 at,
1702                 ErrorKind::Wanted {
1703                     expected: expected,
1704                     found: found,
1705                 },
1706             ),
1707             TokenError::EmptyTableKey(at) => self.error(at, ErrorKind::EmptyTableKey),
1708             TokenError::MultilineStringKey(at) => self.error(at, ErrorKind::MultilineStringKey),
1709         }
1710     }
1711 
error(&self, at: usize, kind: ErrorKind) -> Error1712     fn error(&self, at: usize, kind: ErrorKind) -> Error {
1713         let mut err = Error::from_kind(kind);
1714         let (line, col) = self.to_linecol(at);
1715         err.inner.line = Some(line);
1716         err.inner.col = col;
1717         err
1718     }
1719 
1720     /// Converts a byte offset from an error message to a (line, column) pair
1721     ///
1722     /// All indexes are 0-based.
to_linecol(&self, offset: usize) -> (usize, usize)1723     fn to_linecol(&self, offset: usize) -> (usize, usize) {
1724         let mut cur = 0;
1725         for (i, line) in self.input.lines().enumerate() {
1726             if cur + line.len() + 1 > offset {
1727                 return (i, offset - cur);
1728             }
1729             cur += line.len() + 1;
1730         }
1731         (self.input.lines().count(), 0)
1732     }
1733 }
1734 
1735 impl Error {
1736     /// Produces a (line, column) pair of the position of the error if available
1737     ///
1738     /// All indexes are 0-based.
line_col(&self) -> Option<(usize, usize)>1739     pub fn line_col(&self) -> Option<(usize, usize)> {
1740         self.inner.line.map(|line| (line, self.inner.col))
1741     }
1742 
from_kind(kind: ErrorKind) -> Error1743     fn from_kind(kind: ErrorKind) -> Error {
1744         Error {
1745             inner: Box::new(ErrorInner {
1746                 kind: kind,
1747                 line: None,
1748                 col: 0,
1749                 message: String::new(),
1750                 key: Vec::new(),
1751             }),
1752         }
1753     }
1754 
custom(s: String) -> Error1755     fn custom(s: String) -> Error {
1756         Error {
1757             inner: Box::new(ErrorInner {
1758                 kind: ErrorKind::Custom,
1759                 line: None,
1760                 col: 0,
1761                 message: s,
1762                 key: Vec::new(),
1763             }),
1764         }
1765     }
1766 
1767     /// Do not call this method, it may be removed at any time, it's just an
1768     /// internal implementation detail.
1769     #[doc(hidden)]
add_key_context(&mut self, key: &str)1770     pub fn add_key_context(&mut self, key: &str) {
1771         self.inner.key.insert(0, key.to_string());
1772     }
1773 }
1774 
1775 impl fmt::Display for Error {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1776     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1777         match self.inner.kind {
1778             ErrorKind::UnexpectedEof => "unexpected eof encountered".fmt(f)?,
1779             ErrorKind::InvalidCharInString(c) => write!(
1780                 f,
1781                 "invalid character in string: `{}`",
1782                 c.escape_default().collect::<String>()
1783             )?,
1784             ErrorKind::InvalidEscape(c) => write!(
1785                 f,
1786                 "invalid escape character in string: `{}`",
1787                 c.escape_default().collect::<String>()
1788             )?,
1789             ErrorKind::InvalidHexEscape(c) => write!(
1790                 f,
1791                 "invalid hex escape character in string: `{}`",
1792                 c.escape_default().collect::<String>()
1793             )?,
1794             ErrorKind::InvalidEscapeValue(c) => write!(f, "invalid escape value: `{}`", c)?,
1795             ErrorKind::NewlineInString => "newline in string found".fmt(f)?,
1796             ErrorKind::Unexpected(ch) => write!(
1797                 f,
1798                 "unexpected character found: `{}`",
1799                 ch.escape_default().collect::<String>()
1800             )?,
1801             ErrorKind::UnterminatedString => "unterminated string".fmt(f)?,
1802             ErrorKind::NewlineInTableKey => "found newline in table key".fmt(f)?,
1803             ErrorKind::Wanted { expected, found } => {
1804                 write!(f, "expected {}, found {}", expected, found)?
1805             }
1806             ErrorKind::NumberInvalid => "invalid number".fmt(f)?,
1807             ErrorKind::DateInvalid => "invalid date".fmt(f)?,
1808             ErrorKind::MixedArrayType => "mixed types in an array".fmt(f)?,
1809             ErrorKind::DuplicateTable(ref s) => {
1810                 write!(f, "redefinition of table `{}`", s)?;
1811             }
1812             ErrorKind::RedefineAsArray => "table redefined as array".fmt(f)?,
1813             ErrorKind::EmptyTableKey => "empty table key found".fmt(f)?,
1814             ErrorKind::MultilineStringKey => "multiline strings are not allowed for key".fmt(f)?,
1815             ErrorKind::Custom => self.inner.message.fmt(f)?,
1816             ErrorKind::ExpectedTuple(l) => write!(f, "expected table with length {}", l)?,
1817             ErrorKind::ExpectedTupleIndex {
1818                 expected,
1819                 ref found,
1820             } => write!(f, "expected table key `{}`, but was `{}`", expected, found)?,
1821             ErrorKind::ExpectedEmptyTable => "expected empty table".fmt(f)?,
1822             ErrorKind::DottedKeyInvalidType => {
1823                 "dotted key attempted to extend non-table type".fmt(f)?
1824             }
1825             ErrorKind::UnexpectedKeys {
1826                 ref keys,
1827                 available,
1828             } => write!(
1829                 f,
1830                 "unexpected keys in table: `{:?}`, available keys: `{:?}`",
1831                 keys, available
1832             )?,
1833             ErrorKind::__Nonexhaustive => panic!(),
1834         }
1835 
1836         if !self.inner.key.is_empty() {
1837             write!(f, " for key `")?;
1838             for (i, k) in self.inner.key.iter().enumerate() {
1839                 if i > 0 {
1840                     write!(f, ".")?;
1841                 }
1842                 write!(f, "{}", k)?;
1843             }
1844             write!(f, "`")?;
1845         }
1846 
1847         if let Some(line) = self.inner.line {
1848             write!(f, " at line {}", line + 1)?;
1849         }
1850 
1851         Ok(())
1852     }
1853 }
1854 
1855 impl error::Error for Error {
description(&self) -> &str1856     fn description(&self) -> &str {
1857         match self.inner.kind {
1858             ErrorKind::UnexpectedEof => "unexpected eof encountered",
1859             ErrorKind::InvalidCharInString(_) => "invalid char in string",
1860             ErrorKind::InvalidEscape(_) => "invalid escape in string",
1861             ErrorKind::InvalidHexEscape(_) => "invalid hex escape in string",
1862             ErrorKind::InvalidEscapeValue(_) => "invalid escape value in string",
1863             ErrorKind::NewlineInString => "newline in string found",
1864             ErrorKind::Unexpected(_) => "unexpected or invalid character",
1865             ErrorKind::UnterminatedString => "unterminated string",
1866             ErrorKind::NewlineInTableKey => "found newline in table key",
1867             ErrorKind::Wanted { .. } => "expected a token but found another",
1868             ErrorKind::NumberInvalid => "invalid number",
1869             ErrorKind::DateInvalid => "invalid date",
1870             ErrorKind::MixedArrayType => "mixed types in an array",
1871             ErrorKind::DuplicateTable(_) => "duplicate table",
1872             ErrorKind::RedefineAsArray => "table redefined as array",
1873             ErrorKind::EmptyTableKey => "empty table key found",
1874             ErrorKind::MultilineStringKey => "invalid multiline string for key",
1875             ErrorKind::Custom => "a custom error",
1876             ErrorKind::ExpectedTuple(_) => "expected table length",
1877             ErrorKind::ExpectedTupleIndex { .. } => "expected table key",
1878             ErrorKind::ExpectedEmptyTable => "expected empty table",
1879             ErrorKind::DottedKeyInvalidType => "dotted key invalid type",
1880             ErrorKind::UnexpectedKeys { .. } => "unexpected keys in table",
1881             ErrorKind::__Nonexhaustive => panic!(),
1882         }
1883     }
1884 }
1885 
1886 impl de::Error for Error {
custom<T: fmt::Display>(msg: T) -> Error1887     fn custom<T: fmt::Display>(msg: T) -> Error {
1888         Error::custom(msg.to_string())
1889     }
1890 }
1891 
1892 enum Line<'a> {
1893     Table {
1894         at: usize,
1895         header: Header<'a>,
1896         array: bool,
1897     },
1898     KeyValue(Vec<Cow<'a, str>>, Value<'a>),
1899 }
1900 
1901 struct Header<'a> {
1902     first: bool,
1903     array: bool,
1904     require_newline_after_table: bool,
1905     tokens: Tokenizer<'a>,
1906 }
1907 
1908 impl<'a> Header<'a> {
new(tokens: Tokenizer<'a>, array: bool, require_newline_after_table: bool) -> Header<'a>1909     fn new(tokens: Tokenizer<'a>, array: bool, require_newline_after_table: bool) -> Header<'a> {
1910         Header {
1911             first: true,
1912             array: array,
1913             tokens: tokens,
1914             require_newline_after_table: require_newline_after_table,
1915         }
1916     }
1917 
next(&mut self) -> Result<Option<Cow<'a, str>>, TokenError>1918     fn next(&mut self) -> Result<Option<Cow<'a, str>>, TokenError> {
1919         self.tokens.eat_whitespace()?;
1920 
1921         if self.first || self.tokens.eat(Token::Period)? {
1922             self.first = false;
1923             self.tokens.eat_whitespace()?;
1924             self.tokens.table_key().map(|t| t.1).map(Some)
1925         } else {
1926             self.tokens.expect(Token::RightBracket)?;
1927             if self.array {
1928                 self.tokens.expect(Token::RightBracket)?;
1929             }
1930 
1931             self.tokens.eat_whitespace()?;
1932             if self.require_newline_after_table {
1933                 if !self.tokens.eat_comment()? {
1934                     self.tokens.eat_newline_or_eof()?;
1935                 }
1936             }
1937             Ok(None)
1938         }
1939     }
1940 }
1941 
1942 #[derive(Debug)]
1943 struct Value<'a> {
1944     e: E<'a>,
1945     start: usize,
1946     end: usize,
1947 }
1948 
1949 #[derive(Debug)]
1950 enum E<'a> {
1951     Integer(i64),
1952     Float(f64),
1953     Boolean(bool),
1954     String(Cow<'a, str>),
1955     Datetime(&'a str),
1956     Array(Vec<Value<'a>>),
1957     InlineTable(Vec<(Cow<'a, str>, Value<'a>)>),
1958     DottedTable(Vec<(Cow<'a, str>, Value<'a>)>),
1959 }
1960 
1961 impl<'a> E<'a> {
type_name(&self) -> &'static str1962     fn type_name(&self) -> &'static str {
1963         match *self {
1964             E::String(..) => "string",
1965             E::Integer(..) => "integer",
1966             E::Float(..) => "float",
1967             E::Boolean(..) => "boolean",
1968             E::Datetime(..) => "datetime",
1969             E::Array(..) => "array",
1970             E::InlineTable(..) => "inline table",
1971             E::DottedTable(..) => "dotted table",
1972         }
1973     }
1974 }
1975 
1976 impl<'a> Value<'a> {
same_type(&self, other: &Value<'a>) -> bool1977     fn same_type(&self, other: &Value<'a>) -> bool {
1978         match (&self.e, &other.e) {
1979             (&E::String(..), &E::String(..))
1980             | (&E::Integer(..), &E::Integer(..))
1981             | (&E::Float(..), &E::Float(..))
1982             | (&E::Boolean(..), &E::Boolean(..))
1983             | (&E::Datetime(..), &E::Datetime(..))
1984             | (&E::Array(..), &E::Array(..))
1985             | (&E::InlineTable(..), &E::InlineTable(..)) => true,
1986             (&E::DottedTable(..), &E::DottedTable(..)) => true,
1987 
1988             _ => false,
1989         }
1990     }
1991 }
1992