toml/de/parser/
mod.rs

1#![allow(clippy::type_complexity)]
2
3use serde_spanned::Spanned;
4#[cfg(not(feature = "unbounded"))]
5use toml_parser::parser::RecursionGuard;
6use toml_parser::parser::ValidateWhitespace;
7
8pub use dearray::DeArray;
9pub use detable::DeTable;
10pub use devalue::DeFloat;
11pub use devalue::DeInteger;
12pub use devalue::DeString;
13pub use devalue::DeValue;
14
15use crate::alloc_prelude::*;
16
17pub(crate) mod array;
18pub(crate) mod dearray;
19#[cfg(feature = "debug")]
20pub(crate) mod debug;
21pub(crate) mod detable;
22pub(crate) mod devalue;
23pub(crate) mod document;
24pub(crate) mod inline_table;
25pub(crate) mod key;
26pub(crate) mod value;
27
28pub(crate) fn parse_document<'i>(
29    source: toml_parser::Source<'i>,
30    errors: &mut dyn prelude::ErrorSink,
31) -> Spanned<DeTable<'i>> {
32    let tokens = source.lex().into_vec();
33
34    let mut events = Vec::with_capacity(tokens.len());
35    let mut receiver = ValidateWhitespace::new(&mut events, source);
36    #[cfg(not(feature = "unbounded"))]
37    let mut receiver = RecursionGuard::new(&mut receiver, LIMIT);
38    #[cfg(not(feature = "unbounded"))]
39    let receiver = &mut receiver;
40    #[cfg(feature = "unbounded")]
41    let receiver = &mut receiver;
42    toml_parser::parser::parse_document(&tokens, receiver, errors);
43
44    let mut input = prelude::Input::new(&events);
45    let doc = document::document(&mut input, source, errors);
46    doc
47}
48
49pub(crate) fn parse_value<'i>(
50    source: toml_parser::Source<'i>,
51    errors: &mut dyn prelude::ErrorSink,
52) -> Spanned<DeValue<'i>> {
53    let tokens = source.lex().into_vec();
54
55    let mut events = Vec::with_capacity(tokens.len());
56    let mut receiver = ValidateWhitespace::new(&mut events, source);
57    #[cfg(not(feature = "unbounded"))]
58    let mut receiver = RecursionGuard::new(&mut receiver, LIMIT);
59    #[cfg(not(feature = "unbounded"))]
60    let receiver = &mut receiver;
61    #[cfg(feature = "unbounded")]
62    let receiver = &mut receiver;
63    toml_parser::parser::parse_value(&tokens, receiver, errors);
64
65    let mut input = prelude::Input::new(&events);
66    let value = value::value(&mut input, source, errors);
67    value
68}
69
70#[cfg(not(feature = "unbounded"))]
71const LIMIT: u32 = 80;
72
73pub(crate) mod prelude {
74    pub(crate) use toml_parser::parser::EventKind;
75    pub(crate) use toml_parser::ErrorSink;
76    pub(crate) use toml_parser::ParseError;
77    pub(crate) use winnow::stream::Stream as _;
78
79    pub(crate) type Input<'i> = winnow::stream::TokenSlice<'i, toml_parser::parser::Event>;
80
81    #[cfg(feature = "debug")]
82    pub(crate) use super::debug::trace;
83    #[cfg(feature = "debug")]
84    pub(crate) use super::debug::TraceScope;
85}