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}