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}