]> git.proxmox.com Git - rustc.git/blob - vendor/toml/src/de.rs
New upstream version 1.37.0+dfsg1
[rustc.git] / vendor / toml / src / 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
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.
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 /// ```
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
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.
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
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
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
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
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.
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
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> {
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
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> {
539 fn new(value: Value<'a>) -> ValueDeserializer<'a> {
540 ValueDeserializer {
541 value: value,
542 validate_struct_keys: false,
543 }
544 }
545
546 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
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
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.
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
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
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
710 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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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.
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.
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.
1007 pub fn set_allow_duplicate_after_longer_table(&mut self, allow: bool) {
1008 self.allow_duplciate_after_longer_table = allow;
1009 }
1010
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
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
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
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
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
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.
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
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
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
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
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.
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.
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
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
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.
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
1632 fn eat_whitespace(&mut self) -> Result<(), Error> {
1633 self.tokens
1634 .eat_whitespace()
1635 .map_err(|e| self.token_error(e))
1636 }
1637
1638 fn eat_comment(&mut self) -> Result<bool, Error> {
1639 self.tokens.eat_comment().map_err(|e| self.token_error(e))
1640 }
1641
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
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
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
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
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
1670 fn next(&mut self) -> Result<Option<(Span, Token<'a>)>, Error> {
1671 self.tokens.next().map_err(|e| self.token_error(e))
1672 }
1673
1674 fn peek(&mut self) -> Result<Option<(Span, Token<'a>)>, Error> {
1675 self.tokens.peek().map_err(|e| self.token_error(e))
1676 }
1677
1678 fn eof(&self) -> Error {
1679 self.error(self.input.len(), ErrorKind::UnexpectedEof)
1680 }
1681
1682 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
1712 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.
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.
1739 pub fn line_col(&self) -> Option<(usize, usize)> {
1740 self.inner.line.map(|line| (line, self.inner.col))
1741 }
1742
1743 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
1755 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)]
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 {
1776 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 {
1856 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 {
1887 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> {
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
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> {
1962 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> {
1977 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 }