1#![cfg_attr(docsrs, feature(doc_cfg))]
2#![doc = include_str!("../README.md")]
3#![deny(missing_docs)]
4#![no_std]
5
6#[cfg(feature = "alloc")]
7extern crate alloc;
8
9mod io;
10mod stack;
11mod string;
12mod number;
13
14pub(crate) use io::*;
15pub use io::BytesLike;
16pub use stack::*;
17use string::*;
18
19#[derive(Debug)]
21pub enum JsonError<'bytes, B: BytesLike<'bytes>, S: Stack> {
22 InternalError,
24 BytesError(B::Error),
26 StackError(S::Error),
28 ReusedDeserializer,
30 InvalidKey,
32 InvalidKeyValueDelimiter,
34 InvalidValue,
36 TrailingComma,
38 MismatchedDelimiter,
40 TypeError,
42}
43impl<'bytes, B: BytesLike<'bytes>, S: Stack> Clone for JsonError<'bytes, B, S> {
44 #[inline(always)]
45 fn clone(&self) -> Self {
46 *self
47 }
48}
49impl<'bytes, B: BytesLike<'bytes>, S: Stack> Copy for JsonError<'bytes, B, S> {}
50
51#[inline(always)]
53pub fn as_bool<'bytes, B: BytesLike<'bytes>, S: Stack>(
54 bytes: &B,
55) -> Result<bool, JsonError<'bytes, B, S>> {
56 let first = bytes.peek(0).ok();
57 let second = bytes.peek(1).ok();
58 let third = bytes.peek(2).ok();
59 let fourth = bytes.peek(3).ok();
60 let fifth = bytes.peek(4).ok();
61
62 let is_true = (first, second, third, fourth) == (Some(b't'), Some(b'r'), Some(b'u'), Some(b'e'));
63 let is_false = (first, second, third, fourth, fifth) ==
64 (Some(b'f'), Some(b'a'), Some(b'l'), Some(b's'), Some(b'e'));
65
66 if !(is_true | is_false) {
67 Err(JsonError::TypeError)?;
68 }
69
70 Ok(is_true)
71}
72
73#[inline(always)]
75pub fn is_null<'bytes, B: BytesLike<'bytes>, S: Stack>(
76 bytes: &B,
77) -> Result<bool, JsonError<'bytes, B, S>> {
78 let first = bytes.peek(0).ok();
79 let second = bytes.peek(1).ok();
80 let third = bytes.peek(2).ok();
81 let fourth = bytes.peek(3).ok();
82
83 Ok((first, second, third, fourth) == (Some(b'n'), Some(b'u'), Some(b'l'), Some(b'l')))
84}
85
86#[inline(always)]
88fn advance_whitespace<'bytes, B: BytesLike<'bytes>, S: Stack>(
89 bytes: &mut B,
90) -> Result<(), JsonError<'bytes, B, S>> {
91 loop {
92 let next = bytes.peek(0).map_err(JsonError::BytesError)?;
93 if !matches!(next, b'\x20' | b'\x09' | b'\x0A' | b'\x0D') {
95 break;
96 }
97 bytes.advance(1).map_err(JsonError::BytesError)?;
98 }
99 Ok(())
100}
101
102fn advance_past_comma_or_to_close<'bytes, B: BytesLike<'bytes>, S: Stack>(
104 bytes: &mut B,
105) -> Result<(), JsonError<'bytes, B, S>> {
106 advance_whitespace(bytes)?;
107 match bytes.peek(0).map_err(JsonError::BytesError)? {
108 b',' => {
109 bytes.advance(1).map_err(JsonError::BytesError)?;
110 advance_whitespace(bytes)?;
111 if matches!(bytes.peek(0).map_err(JsonError::BytesError)?, b']' | b'}') {
112 Err(JsonError::TrailingComma)?;
113 }
114 }
115 b']' | b'}' => {}
116 _ => Err(JsonError::InvalidValue)?,
117 }
118 Ok(())
119}
120
121enum SingleStepObjectResult<'bytes, B: BytesLike<'bytes>> {
123 Field {
125 key: String<'bytes, B>,
127 },
128 Closed,
130}
131
132enum SingleStepArrayResult {
134 Value,
136 Closed,
138}
139
140enum SingleStepUnknownResult<'bytes, B: BytesLike<'bytes>> {
142 ObjectOpened,
144 ArrayOpened,
146 String(String<'bytes, B>),
148 Advanced,
150}
151
152enum SingleStepResult<'bytes, B: BytesLike<'bytes>> {
154 Object(SingleStepObjectResult<'bytes, B>),
156 Array(SingleStepArrayResult),
158 Unknown(SingleStepUnknownResult<'bytes, B>),
160}
161
162fn single_step<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack>(
167 bytes: &'parent mut B,
168 stack: &'parent mut S,
169) -> Result<SingleStepResult<'bytes, B>, JsonError<'bytes, B, S>> {
170 match stack.peek().ok_or(JsonError::InternalError)? {
171 State::Object => {
172 let next = bytes.read_byte().map_err(JsonError::BytesError)?;
173
174 if next == b'}' {
176 stack.pop().ok_or(JsonError::InternalError)?;
177
178 if stack.depth() != 0 {
180 advance_past_comma_or_to_close(bytes)?;
181 }
182
183 return Ok(SingleStepResult::Object(SingleStepObjectResult::Closed));
184 }
185
186 if next != b'"' {
188 Err(JsonError::InvalidKey)?;
189 }
190 let key = read_string(bytes)?;
191
192 advance_whitespace::<_, S>(bytes)?;
194 if bytes.read_byte().map_err(JsonError::BytesError)? != b':' {
195 Err(JsonError::InvalidKeyValueDelimiter)?;
196 }
197
198 advance_whitespace::<_, S>(bytes)?;
200 stack.push(State::Unknown).map_err(JsonError::StackError)?;
201 Ok(SingleStepResult::Object(SingleStepObjectResult::Field { key }))
202 }
203 State::Array => {
204 if bytes.peek(0).map_err(JsonError::BytesError)? == b']' {
206 stack.pop().ok_or(JsonError::InternalError)?;
207 bytes.advance(1).map_err(JsonError::BytesError)?;
208
209 if stack.depth() != 0 {
211 advance_past_comma_or_to_close(bytes)?;
212 }
213
214 return Ok(SingleStepResult::Array(SingleStepArrayResult::Closed));
215 }
216
217 stack.push(State::Unknown).map_err(JsonError::StackError)?;
219 Ok(SingleStepResult::Array(SingleStepArrayResult::Value))
220 }
221 State::Unknown => {
222 stack.pop().ok_or(JsonError::InternalError)?;
223
224 let mut result = SingleStepResult::Unknown(SingleStepUnknownResult::Advanced);
225 match bytes.peek(0).map_err(JsonError::BytesError)? {
226 b'{' => {
228 bytes.advance(1).map_err(JsonError::BytesError)?;
229 advance_whitespace(bytes)?;
230 stack.push(State::Object).map_err(JsonError::StackError)?;
231 return Ok(SingleStepResult::Unknown(SingleStepUnknownResult::ObjectOpened));
232 }
233 b'[' => {
235 bytes.advance(1).map_err(JsonError::BytesError)?;
236 advance_whitespace(bytes)?;
237 stack.push(State::Array).map_err(JsonError::StackError)?;
238 return Ok(SingleStepResult::Unknown(SingleStepUnknownResult::ArrayOpened));
239 }
240 b'"' => {
242 bytes.advance(1).map_err(JsonError::BytesError)?;
243 result = SingleStepResult::Unknown(SingleStepUnknownResult::String(read_string(bytes)?));
245 }
246 _ => {
248 let is_number = match number::as_number(bytes) {
250 Ok((len, _)) => Some(len),
251 Err(JsonError::TypeError) => None,
252 Err(e) => Err(e)?,
253 };
254 let is_bool = match as_bool(bytes) {
255 Ok(value) => Some(if value { 4 } else { 5 }),
256 Err(JsonError::TypeError) => None,
257 Err(e) => Err(e)?,
258 };
259 let is_null = match is_null(bytes) {
260 Ok(is_null) => {
261 if is_null {
262 Some(4)
263 } else {
264 None
265 }
266 }
267 Err(e) => Err(e)?,
268 };
269
270 if let Some(len) = is_number.or(is_bool).or(is_null) {
271 bytes.advance(len).map_err(JsonError::BytesError)?;
272 } else {
273 Err(JsonError::InvalidValue)?;
274 }
275 }
276 }
277
278 advance_past_comma_or_to_close(bytes)?;
280
281 Ok(result)
282 }
283 }
284}
285
286pub struct Deserializer<'bytes, B: BytesLike<'bytes>, S: Stack> {
288 bytes: B,
289 stack: S,
290 error: Option<JsonError<'bytes, B, S>>,
296}
297
298pub struct Value<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> {
301 deserializer: Option<&'parent mut Deserializer<'bytes, B, S>>,
302}
303
304impl<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> Drop for Value<'bytes, 'parent, B, S> {
305 fn drop(&mut self) {
306 if let Some(deserializer) = self.deserializer.take() {
312 if deserializer.error.is_some() {
313 return;
314 }
315
316 let Some(current) = deserializer.stack.peek() else {
317 deserializer.error = Some(JsonError::InternalError);
318 return;
319 };
320
321 let mut depth = match current {
322 State::Object | State::Array => 1,
323 State::Unknown => {
324 let step = match single_step(&mut deserializer.bytes, &mut deserializer.stack) {
325 Ok(SingleStepResult::Unknown(step)) => step,
326 Ok(_) => {
327 deserializer.error = Some(JsonError::InternalError);
328 return;
329 }
330 Err(e) => {
331 deserializer.error = Some(e);
332 return;
333 }
334 };
335 match step {
336 SingleStepUnknownResult::String(_) | SingleStepUnknownResult::Advanced => return,
338 SingleStepUnknownResult::ObjectOpened | SingleStepUnknownResult::ArrayOpened => 1,
340 }
341 }
342 };
343
344 while depth != 0 {
346 let step = match single_step(&mut deserializer.bytes, &mut deserializer.stack) {
347 Ok(step) => step,
348 Err(e) => {
349 deserializer.error = Some(e);
350 return;
351 }
352 };
353 match step {
354 SingleStepResult::Object(SingleStepObjectResult::Closed) |
355 SingleStepResult::Array(SingleStepArrayResult::Closed) => depth -= 1,
356 SingleStepResult::Unknown(
357 SingleStepUnknownResult::ObjectOpened | SingleStepUnknownResult::ArrayOpened,
358 ) => depth += 1,
359 _ => {}
360 }
361 }
362 }
363 }
364}
365
366impl<'bytes, B: BytesLike<'bytes>, S: Stack> Deserializer<'bytes, B, S> {
367 pub fn new(mut bytes: B) -> Result<Self, JsonError<'bytes, B, S>> {
369 advance_whitespace(&mut bytes)?;
370
371 let mut stack = S::empty();
372 stack.push(State::Unknown).map_err(JsonError::StackError)?;
373
374 Ok(Deserializer { bytes, stack, error: None })
375 }
376
377 #[inline(always)]
384 pub fn value(&mut self) -> Result<Value<'bytes, '_, B, S>, JsonError<'bytes, B, S>> {
385 if self.stack.depth() != 1 {
386 Err(JsonError::ReusedDeserializer)?;
387 }
388 let result = Value { deserializer: Some(self) };
389 if !(result.is_object()? || result.is_array()?) {
390 Err(JsonError::TypeError)?;
391 }
392 Ok(result)
393 }
394}
395
396pub struct FieldIterator<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> {
398 deserializer: &'parent mut Deserializer<'bytes, B, S>,
399 done: bool,
400}
401
402impl<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> Drop
404 for FieldIterator<'bytes, 'parent, B, S>
405{
406 #[inline(always)]
407 fn drop(&mut self) {
408 if self.deserializer.error.is_some() {
409 return;
410 }
411
412 loop {
413 let Some(next) = self.next() else { break };
414 let next = next.map(|_| ());
415 match next {
416 Ok(()) => {}
417 Err(e) => {
418 self.deserializer.error = Some(e);
419 break;
420 }
421 }
422 }
423 }
424}
425
426#[rustfmt::skip]
427impl<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack>
428 FieldIterator<'bytes, 'parent, B, S>
429{
430 #[allow(clippy::type_complexity, clippy::should_implement_trait)]
442 pub fn next(
443 &mut self,
444 ) -> Option<Result<(String<'bytes, B>, Value<'bytes, '_, B, S>), JsonError<'bytes, B, S>>>
445 {
446 if let Some(err) = self.deserializer.error {
447 return Some(Err(err));
448 }
449
450 if self.done {
451 None?;
452 }
453
454 loop {
455 let result = match single_step(&mut self.deserializer.bytes, &mut self.deserializer.stack) {
456 Ok(SingleStepResult::Object(result)) => result,
457 Ok(_) => break Some(Err(JsonError::InternalError)),
458 Err(e) => break Some(Err(e)),
459 };
460 match result {
461 SingleStepObjectResult::Field { key } => {
462 break Some(Ok((key, Value { deserializer: Some(self.deserializer) })))
463 }
464 SingleStepObjectResult::Closed => {
465 self.done = true;
466 None?
467 }
468 }
469 }
470 }
471}
472
473pub struct ArrayIterator<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> {
475 deserializer: &'parent mut Deserializer<'bytes, B, S>,
476 done: bool,
477}
478
479impl<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> Drop
481 for ArrayIterator<'bytes, 'parent, B, S>
482{
483 #[inline(always)]
484 fn drop(&mut self) {
485 if self.deserializer.error.is_some() {
486 return;
487 }
488
489 loop {
490 let Some(next) = self.next() else { break };
491 let next = next.map(|_| ());
492 match next {
493 Ok(()) => {}
494 Err(e) => {
495 self.deserializer.error = Some(e);
496 break;
497 }
498 }
499 }
500 }
501}
502
503impl<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> ArrayIterator<'bytes, 'parent, B, S> {
504 #[allow(clippy::should_implement_trait)]
516 pub fn next(&mut self) -> Option<Result<Value<'bytes, '_, B, S>, JsonError<'bytes, B, S>>> {
517 if let Some(err) = self.deserializer.error {
518 return Some(Err(err));
519 }
520
521 if self.done {
522 None?;
523 }
524
525 loop {
526 let result = match single_step(&mut self.deserializer.bytes, &mut self.deserializer.stack) {
527 Ok(SingleStepResult::Array(result)) => result,
528 Ok(_) => break Some(Err(JsonError::InternalError)),
529 Err(e) => break Some(Err(e)),
530 };
531 match result {
532 SingleStepArrayResult::Value => {
533 break Some(Ok(Value { deserializer: Some(self.deserializer) }))
534 }
535 SingleStepArrayResult::Closed => {
536 self.done = true;
537 None?
538 }
539 }
540 }
541 }
542}
543
544impl<'bytes, 'parent, B: BytesLike<'bytes>, S: Stack> Value<'bytes, 'parent, B, S> {
545 #[inline(always)]
547 pub fn is_object(&self) -> Result<bool, JsonError<'bytes, B, S>> {
548 Ok(
549 self
550 .deserializer
551 .as_ref()
552 .ok_or(JsonError::InternalError)?
553 .bytes
554 .peek(0)
555 .map_err(JsonError::BytesError)? ==
556 b'{',
557 )
558 }
559
560 pub fn fields(mut self) -> Result<FieldIterator<'bytes, 'parent, B, S>, JsonError<'bytes, B, S>> {
564 let deserializer = self.deserializer.take().ok_or(JsonError::InternalError)?;
565 if let Some(err) = deserializer.error {
566 Err(err)?;
567 }
568
569 match single_step(&mut deserializer.bytes, &mut deserializer.stack)? {
570 SingleStepResult::Unknown(SingleStepUnknownResult::ObjectOpened) => {
571 Ok(FieldIterator { deserializer, done: false })
572 }
573 _ => Err(JsonError::TypeError),
574 }
575 }
576
577 #[inline(always)]
579 pub fn is_array(&self) -> Result<bool, JsonError<'bytes, B, S>> {
580 Ok(
581 self
582 .deserializer
583 .as_ref()
584 .ok_or(JsonError::InternalError)?
585 .bytes
586 .peek(0)
587 .map_err(JsonError::BytesError)? ==
588 b'[',
589 )
590 }
591
592 pub fn iterate(
594 mut self,
595 ) -> Result<ArrayIterator<'bytes, 'parent, B, S>, JsonError<'bytes, B, S>> {
596 let deserializer = self.deserializer.take().ok_or(JsonError::InternalError)?;
597 if let Some(err) = deserializer.error {
598 Err(err)?;
599 }
600
601 match single_step(&mut deserializer.bytes, &mut deserializer.stack)? {
602 SingleStepResult::Unknown(SingleStepUnknownResult::ArrayOpened) => {
603 Ok(ArrayIterator { deserializer, done: false })
604 }
605 _ => Err(JsonError::TypeError),
606 }
607 }
608
609 #[inline(always)]
611 pub fn is_str(&self) -> Result<bool, JsonError<'bytes, B, S>> {
612 Ok(
613 self
614 .deserializer
615 .as_ref()
616 .ok_or(JsonError::InternalError)?
617 .bytes
618 .peek(0)
619 .map_err(JsonError::BytesError)? ==
620 b'"',
621 )
622 }
623
624 #[inline(always)]
629 pub fn to_str(mut self) -> Result<String<'bytes, B>, JsonError<'bytes, B, S>> {
630 let deserializer = self.deserializer.take().ok_or(JsonError::InternalError)?;
631 match single_step(&mut deserializer.bytes, &mut deserializer.stack)? {
632 SingleStepResult::Unknown(SingleStepUnknownResult::String(str)) => Ok(str),
633 _ => Err(JsonError::TypeError),
634 }
635 }
636
637 #[inline(always)]
644 pub fn as_i64(&self) -> Result<i64, JsonError<'bytes, B, S>> {
645 let bytes = &self.deserializer.as_ref().ok_or(JsonError::InternalError)?.bytes;
646
647 let (i, str) = number::as_number_str(bytes)?;
648 let str = core::str::from_utf8(&str[.. i]).map_err(|_| JsonError::InternalError)?;
649 if str.contains('.') || str.contains('e') || str.contains('E') {
650 Err(JsonError::TypeError)?;
651 }
652 <i64 as core::str::FromStr>::from_str(str).map_err(|_| JsonError::TypeError)
653 }
654
655 #[inline(always)]
657 pub fn as_f64(&self) -> Result<f64, JsonError<'bytes, B, S>> {
658 Ok(number::as_number(&self.deserializer.as_ref().ok_or(JsonError::InternalError)?.bytes)?.1)
659 }
660
661 #[inline(always)]
663 pub fn as_bool(&self) -> Result<bool, JsonError<'bytes, B, S>> {
664 as_bool(&self.deserializer.as_ref().ok_or(JsonError::InternalError)?.bytes)
665 }
666
667 #[inline(always)]
669 pub fn is_null(&self) -> Result<bool, JsonError<'bytes, B, S>> {
670 is_null(&self.deserializer.as_ref().ok_or(JsonError::InternalError)?.bytes)
671 }
672}