toml/de/parser/
value.rs

1use serde_spanned::Spanned;
2
3use crate::alloc_prelude::*;
4use crate::de::parser::array::on_array;
5use crate::de::parser::inline_table::on_inline_table;
6use crate::de::parser::prelude::*;
7use crate::de::DeFloat;
8use crate::de::DeInteger;
9use crate::de::DeValue;
10
11/// ```bnf
12/// val = string / boolean / array / inline-table / date-time / float / integer
13/// ```
14pub(crate) fn value<'i>(
15    input: &mut Input<'_>,
16    source: toml_parser::Source<'i>,
17    errors: &mut dyn ErrorSink,
18) -> Spanned<DeValue<'i>> {
19    #[cfg(feature = "debug")]
20    let _scope = TraceScope::new("value");
21    if let Some(event) = input.next_token() {
22        match event.kind() {
23            EventKind::StdTableOpen
24            | EventKind::ArrayTableOpen
25            | EventKind::InlineTableClose
26            | EventKind::ArrayClose
27            | EventKind::ValueSep
28            | EventKind::Comment
29            | EventKind::Newline
30            | EventKind::Error
31            | EventKind::SimpleKey
32            | EventKind::KeySep
33            | EventKind::KeyValSep
34            | EventKind::StdTableClose
35            | EventKind::ArrayTableClose => {
36                #[cfg(feature = "debug")]
37                trace(
38                    &format!("unexpected {event:?}"),
39                    anstyle::AnsiColor::Red.on_default(),
40                );
41            }
42            EventKind::Whitespace => {
43                #[cfg(feature = "debug")]
44                trace(
45                    &format!("unexpected {event:?}"),
46                    anstyle::AnsiColor::Red.on_default(),
47                );
48            }
49            EventKind::InlineTableOpen => {
50                return on_inline_table(event, input, source, errors);
51            }
52            EventKind::ArrayOpen => {
53                return on_array(event, input, source, errors);
54            }
55            EventKind::Scalar => {
56                return on_scalar(event, source, errors);
57            }
58        }
59    }
60
61    Spanned::new(0..0, DeValue::Integer(Default::default()))
62}
63
64pub(crate) fn on_scalar<'i>(
65    event: &toml_parser::parser::Event,
66    source: toml_parser::Source<'i>,
67    errors: &mut dyn ErrorSink,
68) -> Spanned<DeValue<'i>> {
69    #[cfg(feature = "debug")]
70    let _scope = TraceScope::new("on_scalar");
71    let value_span = event.span();
72    let value_span = value_span.start()..value_span.end();
73
74    let raw = source.get(event).unwrap();
75    let mut decoded = alloc::borrow::Cow::Borrowed("");
76    let kind = raw.decode_scalar(&mut decoded, errors);
77    match kind {
78        toml_parser::decoder::ScalarKind::String => {
79            Spanned::new(value_span, DeValue::String(decoded))
80        }
81        toml_parser::decoder::ScalarKind::Boolean(value) => {
82            Spanned::new(value_span, DeValue::Boolean(value))
83        }
84        toml_parser::decoder::ScalarKind::DateTime => {
85            let value = match decoded.parse::<toml_datetime::Datetime>() {
86                Ok(value) => value,
87                Err(err) => {
88                    errors.report_error(
89                        ParseError::new(err.to_string()).with_unexpected(event.span()),
90                    );
91                    toml_datetime::Datetime {
92                        date: None,
93                        time: None,
94                        offset: None,
95                    }
96                }
97            };
98            Spanned::new(value_span, DeValue::Datetime(value))
99        }
100        toml_parser::decoder::ScalarKind::Float => {
101            Spanned::new(value_span, DeValue::Float(DeFloat { inner: decoded }))
102        }
103        toml_parser::decoder::ScalarKind::Integer(radix) => Spanned::new(
104            value_span,
105            DeValue::Integer(DeInteger {
106                inner: decoded,
107                radix: radix.value(),
108            }),
109        ),
110    }
111}