1use 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
25type TablePair<'a> = ((Span, Cow<'a, str>), Value<'a>);
27
28pub 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
42pub 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#[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#[derive(Debug, PartialEq, Eq, Clone)]
101#[non_exhaustive]
102enum ErrorKind {
103 UnexpectedEof,
105
106 InvalidCharInString(char),
108
109 InvalidEscape(char),
111
112 InvalidHexEscape(char),
114
115 InvalidEscapeValue(u32),
119
120 NewlineInString,
122
123 Unexpected(char),
126
127 UnterminatedString,
130
131 NewlineInTableKey,
133
134 NumberInvalid,
136
137 DateInvalid,
139
140 Wanted {
142 expected: &'static str,
144 found: &'static str,
146 },
147
148 DuplicateTable(String),
150
151 RedefineAsArray,
153
154 EmptyTableKey,
156
157 MultilineStringKey,
159
160 Custom,
163
164 ExpectedTuple(usize),
167
168 ExpectedTupleIndex {
171 expected: usize,
173 found: String,
175 },
176
177 ExpectedEmptyTable,
179
180 DottedKeyInvalidType,
182
183 UnexpectedKeys {
187 keys: Vec<String>,
189 available: &'static [&'static str],
191 },
192
193 UnquotedString,
195}
196
197pub 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 err.fix_offset(|| tables.last().map(|table| table.at));
237 err.fix_linecol(|at| self.to_linecol(at));
238 err
239 })
240 }
241
242 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
321fn 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
340fn 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 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 !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 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 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 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 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 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 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, 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
1151struct 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(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 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 "", fields,
1257 visitor,
1258 )
1259 }
1260}
1261
1262impl<'a> Deserializer<'a> {
1263 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 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 let mut lookahead = self.tokens.clone();
1726 if let Ok(Some((_, Token::Whitespace(" ")))) = lookahead.next() {
1727 if let Ok(Some((_, Token::Keylike(_)))) = lookahead.next() {
1729 self.next()?; self.next()?; }
1732 }
1733
1734 if colon_eaten || self.eat(Token::Colon)? {
1735 match self.next()? {
1737 Some((_, Token::Keylike(_))) => {}
1738 _ => return Err(self.error(start, ErrorKind::DateInvalid)),
1739 }
1740 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 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 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 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 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 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 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 fn to_linecol(&self, offset: usize) -> (usize, usize) {
1995 let mut cur = 0;
1996 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 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 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}