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
11pub(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}