toml/de/parser/detable.rs
1use alloc::borrow::Cow;
2
3use serde_spanned::Spanned;
4
5use crate::alloc_prelude::*;
6use crate::de::DeString;
7use crate::de::DeValue;
8use crate::map::Map;
9
10/// Type representing a TOML table, payload of the `Value::Table` variant.
11///
12/// By default it entries are stored in
13/// [lexicographic order](https://doc.rust-lang.org/std/primitive.str.html#impl-Ord-for-str)
14/// of the keys. Enable the `preserve_order` feature to store entries in the order they appear in
15/// the source file.
16pub type DeTable<'i> = Map<Spanned<DeString<'i>>, Spanned<DeValue<'i>>>;
17
18impl<'i> DeTable<'i> {
19 /// Parse a TOML document
20 pub fn parse(input: &'i str) -> Result<Spanned<Self>, crate::de::Error> {
21 let source = toml_parser::Source::new(input);
22 let mut errors = crate::de::error::TomlSink::<Option<_>>::new(source);
23 let value = crate::de::parser::parse_document(source, &mut errors);
24 if let Some(err) = errors.into_inner() {
25 Err(err)
26 } else {
27 Ok(value)
28 }
29 }
30
31 /// Parse a TOML document, with best effort recovery on error
32 pub fn parse_recoverable(input: &'i str) -> (Spanned<Self>, Vec<crate::de::Error>) {
33 let source = toml_parser::Source::new(input);
34 let mut errors = crate::de::error::TomlSink::<Vec<_>>::new(source);
35 let value = crate::de::parser::parse_document(source, &mut errors);
36 (value, errors.into_inner())
37 }
38
39 /// Ensure no data is borrowed
40 pub fn make_owned(&mut self) {
41 self.mut_entries(|k, v| {
42 let owned = core::mem::take(k.get_mut());
43 *k.get_mut() = Cow::Owned(owned.into_owned());
44 v.get_mut().make_owned();
45 });
46 }
47}