1use crate::*;
2
3#[inline(always)]
5fn advance_whitespace<'read, R: Read<'read>, S: Stack>(
6 reader: &mut PeekableRead<'read, R>,
7) -> Result<(), JsonError<'read, R, S>> {
8 let mut next;
9 while {
10 next = reader.peek();
11 matches!(next, b'\x20' | b'\x09' | b'\x0A' | b'\x0D')
13 } {
14 reader.read_byte().map_err(JsonError::ReadError)?;
15 }
16 Ok(())
17}
18
19#[inline(always)]
21pub(super) fn advance_past_colon<'read, R: Read<'read>, S: Stack>(
22 reader: &mut PeekableRead<'read, R>,
23) -> Result<(), JsonError<'read, R, S>> {
24 advance_whitespace(reader)?;
25 match reader.read_byte().map_err(JsonError::ReadError)? {
26 b':' => advance_whitespace(reader)?,
27 _ => Err(JsonError::InvalidKeyValueDelimiter)?,
28 }
29 Ok(())
30}
31
32#[inline(always)]
34pub(super) fn advance_past_comma_or_to_close<'read, R: Read<'read>, S: Stack>(
35 reader: &mut PeekableRead<'read, R>,
36) -> Result<(), JsonError<'read, R, S>> {
37 advance_whitespace(reader)?;
38 match reader.peek() {
39 b',' => {
40 reader.read_byte().map_err(JsonError::ReadError)?;
41 advance_whitespace(reader)?;
42 if matches!(reader.peek(), b']' | b'}') {
43 Err(JsonError::TrailingComma)?;
44 }
45 }
46 b']' | b'}' => {}
47 _ => Err(JsonError::InvalidValue)?,
48 }
49 Ok(())
50}
51
52pub(super) enum SingleStepObjectResult {
54 Field,
56 Closed,
58}
59
60pub(super) enum SingleStepArrayResult {
62 Value,
64 Closed,
66}
67
68pub(super) enum SingleStepUnknownResult {
70 ObjectOpened,
72 ArrayOpened,
74 String,
76 Number(Number),
78 Bool(bool),
80 Null,
82}
83
84pub(super) enum SingleStepResult {
86 Object(SingleStepObjectResult),
88 Array(SingleStepArrayResult),
90 Unknown(SingleStepUnknownResult),
92}
93
94fn single_step<'read, 'parent, R: Read<'read>, S: Stack>(
99 reader: &'parent mut PeekableRead<'read, R>,
100 stack: &'parent mut S,
101) -> Result<SingleStepResult, JsonError<'read, R, S>> {
102 match stack.peek().ok_or(JsonError::InternalError)? {
103 State::Object => {
104 let next = reader.peek();
105
106 if next == b'}' {
108 stack.pop().ok_or(JsonError::InternalError)?;
109
110 if stack.depth() != 0 {
112 reader.read_byte().map_err(JsonError::ReadError)?;
119 advance_past_comma_or_to_close(reader)?;
120 }
121
122 return Ok(SingleStepResult::Object(SingleStepObjectResult::Closed));
123 }
124
125 if next != b'"' {
127 Err(JsonError::InvalidKey)?;
128 }
129 reader.read_byte().map_err(JsonError::ReadError)?;
131
132 stack.push(State::Unknown).map_err(JsonError::StackError)?;
134 Ok(SingleStepResult::Object(SingleStepObjectResult::Field))
135 }
136 State::Array => {
137 if reader.peek() == b']' {
139 stack.pop().ok_or(JsonError::InternalError)?;
140
141 if stack.depth() != 0 {
143 reader.read_byte().map_err(JsonError::ReadError)?;
144 advance_past_comma_or_to_close(reader)?;
145 }
146
147 return Ok(SingleStepResult::Array(SingleStepArrayResult::Closed));
148 }
149
150 stack.push(State::Unknown).map_err(JsonError::StackError)?;
152 Ok(SingleStepResult::Array(SingleStepArrayResult::Value))
153 }
154 State::Unknown => {
155 stack.pop().ok_or(JsonError::InternalError)?;
156
157 let result = match kind(reader) {
158 Type::Object => {
160 reader.read_byte().map_err(JsonError::ReadError)?;
161 advance_whitespace(reader)?;
162 stack.push(State::Object).map_err(JsonError::StackError)?;
163 return Ok(SingleStepResult::Unknown(SingleStepUnknownResult::ObjectOpened));
164 }
165 Type::Array => {
167 reader.read_byte().map_err(JsonError::ReadError)?;
168 advance_whitespace(reader)?;
169 stack.push(State::Array).map_err(JsonError::StackError)?;
170 return Ok(SingleStepResult::Unknown(SingleStepUnknownResult::ArrayOpened));
171 }
172 Type::String => {
174 reader.read_byte().map_err(JsonError::ReadError)?;
175 return Ok(SingleStepResult::Unknown(SingleStepUnknownResult::String));
176 }
177 Type::Number => {
178 SingleStepResult::Unknown(SingleStepUnknownResult::Number(number::to_number_str(reader)?))
179 }
180 Type::Bool => {
181 let mut bool_string = [0; 4];
182 reader.read_exact_into_non_empty_slice(&mut bool_string).map_err(JsonError::ReadError)?;
183 let bool = if &bool_string == b"true" {
184 true
185 } else {
186 let e = reader.read_byte().map_err(JsonError::ReadError)?;
187 if !((bool_string == *b"fals") & (e == b'e')) {
188 Err(JsonError::TypeError)?;
189 }
190 false
191 };
192 SingleStepResult::Unknown(SingleStepUnknownResult::Bool(bool))
193 }
194 Type::Null => {
195 let mut null_string = [0; 4];
196 reader.read_exact_into_non_empty_slice(&mut null_string).map_err(JsonError::ReadError)?;
197 if null_string != *b"null" {
198 Err(JsonError::InvalidValue)?;
199 }
200 SingleStepResult::Unknown(SingleStepUnknownResult::Null)
201 }
202 };
203
204 advance_past_comma_or_to_close(reader)?;
206
207 Ok(result)
208 }
209 }
210}
211
212pub struct Deserializer<'read, R: Read<'read>, S: Stack> {
214 pub(crate) reader: PeekableRead<'read, R>,
215 stack: S,
216 pub(crate) error: Option<JsonError<'read, R, S>>,
222}
223
224impl<'read, R: Read<'read>, S: Stack> Deserializer<'read, R, S> {
225 #[inline(always)]
226 pub(super) fn single_step(&mut self) -> Result<SingleStepResult, JsonError<'read, R, S>> {
227 if let Some(e) = self.error {
228 Err(e)?;
229 }
230 let res = single_step(&mut self.reader, &mut self.stack);
231 if let Some(e) = res.as_ref().err() {
232 self.error = Some(*e);
233 }
234 res
235 }
236}
237
238pub struct Value<'read, 'parent, R: Read<'read>, S: Stack> {
241 pub(crate) deserializer: Option<&'parent mut Deserializer<'read, R, S>>,
242}
243
244impl<'read, 'parent, R: Read<'read>, S: Stack> Drop for Value<'read, 'parent, R, S> {
245 fn drop(&mut self) {
246 if let Some(deserializer) = self.deserializer.take() {
252 if deserializer.error.is_some() {
253 return;
254 }
255
256 let Some(current) = deserializer.stack.peek() else {
257 deserializer.error = Some(JsonError::InternalError);
258 return;
259 };
260
261 let mut depth = match current {
262 State::Object | State::Array => 1,
263 State::Unknown => {
264 let step = match deserializer.single_step() {
265 Ok(SingleStepResult::Unknown(step)) => step,
266 Ok(_) => {
267 deserializer.error = Some(JsonError::InternalError);
268 return;
269 }
270 Err(_) => return,
271 };
272 match step {
273 SingleStepUnknownResult::Number(_) |
275 SingleStepUnknownResult::Bool(_) |
276 SingleStepUnknownResult::Null => return,
277 SingleStepUnknownResult::String => {
279 handle_string_value(deserializer);
280 return;
281 }
282 SingleStepUnknownResult::ObjectOpened | SingleStepUnknownResult::ArrayOpened => 1,
284 }
285 }
286 };
287
288 while depth != 0 {
290 let Ok(step) = deserializer.single_step() else { return };
291 match step {
292 SingleStepResult::Unknown(SingleStepUnknownResult::String) => {
293 handle_string_value(deserializer);
294 }
295 SingleStepResult::Object(SingleStepObjectResult::Field) => {
296 handle_field(deserializer);
297 }
298 SingleStepResult::Object(SingleStepObjectResult::Closed) |
299 SingleStepResult::Array(SingleStepArrayResult::Closed) => depth -= 1,
300 SingleStepResult::Unknown(
301 SingleStepUnknownResult::ObjectOpened | SingleStepUnknownResult::ArrayOpened,
302 ) => depth += 1,
303 _ => {}
304 }
305 }
306 }
307 }
308}
309
310impl<'read, R: Read<'read>, S: Stack> Deserializer<'read, R, S> {
311 #[inline(always)]
320 pub fn new(reader: R) -> Result<Self, JsonError<'read, R, S>> {
321 let mut reader = PeekableRead::try_from(reader).map_err(JsonError::ReadError)?;
322 advance_whitespace(&mut reader)?;
323
324 let mut stack = S::empty();
325 stack.push(State::Unknown).map_err(JsonError::StackError)?;
326
327 Ok(Deserializer { reader, stack, error: None })
328 }
329
330 #[inline(always)]
337 pub fn value(&mut self) -> Result<Value<'read, '_, R, S>, JsonError<'read, R, S>> {
338 if (self.stack.depth() != 1) || self.error.is_some() {
339 Err(JsonError::ReusedDeserializer)?;
340 }
341 let mut result = Value { deserializer: Some(self) };
342 if !matches!(result.kind()?, Type::Object | Type::Array) {
343 Err(JsonError::TypeError)?;
344 }
345 Ok(result)
346 }
347}