toml/
de.rs

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