1use serde_json::{json, Value};
2
3fn ends_with_odd_backslashes(s: &str) -> bool {
4 s.chars().rev().take_while(|&c| c == '\\').count() % 2 == 1
5}
6
7fn decode_json_string(raw: &str) -> Result<String, String> {
8 serde_json::from_str::<String>(&format!("\"{raw}\"")).map_err(|e| e.to_string())
9}
10
11#[derive(Clone, Debug)]
12enum ObjectStatus {
13 Ready,
15 StringQuoteOpen,
17 StringQuoteClose,
19 Scalar {
21 value_so_far: Vec<char>,
22 },
23 ScalarNumber {
24 value_so_far: Vec<char>,
25 },
26 StartArray,
28 ArrayValueQuoteOpen {
30 index: usize,
31 },
32 ArrayValueQuoteClose,
34 ArrayValueScalar {
36 index: usize,
37 value_so_far: Vec<char>,
38 },
39 ArrayValueNested,
41 StartProperty,
43 KeyQuoteOpen {
46 key_so_far: Vec<char>,
47 },
48 KeyQuoteClose {
50 key: Vec<char>,
51 },
52 Colon {
54 key: Vec<char>,
55 },
56 ValueQuoteOpen {
58 key: Vec<char>,
59 },
61 ValueQuoteClose,
62
63 ValueScalar {
67 key: Vec<char>,
68 value_so_far: Vec<char>,
69 },
70 ValueNested {
72 key: Vec<char>,
73 },
74
75 Closed,
77}
78
79fn process_char(
83 object: &mut Value,
84 current_status: &mut ObjectStatus,
85 current_char: char,
86) -> Result<(), String> {
87 match (object, current_status, current_char) {
88 (val @ Value::Null, sts @ ObjectStatus::Ready, '"') => {
89 *val = json!("");
90 *sts = ObjectStatus::StringQuoteOpen;
91 }
92 (val @ Value::Null, sts @ ObjectStatus::Ready, '{') => {
93 *val = json!({});
94 *sts = ObjectStatus::StartProperty;
95 }
96 (val @ Value::Null, sts @ ObjectStatus::Ready, '[') => {
97 *val = json!([]);
98 *sts = ObjectStatus::StartArray;
99 }
100 (val @ Value::Null, sts @ ObjectStatus::Ready, 't') => {
102 *val = json!(true);
103 *sts = ObjectStatus::Scalar {
104 value_so_far: vec!['t'],
105 };
106 }
107 (
108 Value::Bool(true),
109 ObjectStatus::Scalar {
110 ref mut value_so_far,
111 },
112 'r',
113 ) if *value_so_far == vec!['t'] => {
114 value_so_far.push('r');
115 }
116 (
117 Value::Bool(true),
118 ObjectStatus::Scalar {
119 ref mut value_so_far,
120 },
121 'u',
122 ) if *value_so_far == vec!['t', 'r'] => {
123 value_so_far.push('u');
124 }
125 (Value::Bool(true), sts @ ObjectStatus::Scalar { .. }, 'e') => {
126 *sts = ObjectStatus::Closed;
127 }
128 (val @ Value::Null, sts @ ObjectStatus::Ready, 'f') => {
130 *val = json!(false);
131 *sts = ObjectStatus::Scalar {
132 value_so_far: vec!['f'],
133 };
134 }
135 (
136 Value::Bool(false),
137 ObjectStatus::Scalar {
138 ref mut value_so_far,
139 },
140 'a',
141 ) if *value_so_far == vec!['f'] => {
142 value_so_far.push('a');
143 }
144 (
145 Value::Bool(false),
146 ObjectStatus::Scalar {
147 ref mut value_so_far,
148 },
149 'l',
150 ) if *value_so_far == vec!['f', 'a'] => {
151 value_so_far.push('l');
152 }
153 (
154 Value::Bool(false),
155 ObjectStatus::Scalar {
156 ref mut value_so_far,
157 },
158 's',
159 ) if *value_so_far == vec!['f', 'a', 'l'] => {
160 value_so_far.push('s');
161 }
162 (Value::Bool(false), sts @ ObjectStatus::Scalar { .. }, 'e') => {
163 *sts = ObjectStatus::Closed;
164 }
165 (val @ Value::Null, sts @ ObjectStatus::Ready, 'n') => {
167 *val = json!(null);
168 *sts = ObjectStatus::Scalar {
169 value_so_far: vec!['n'],
170 };
171 }
172 (
173 Value::Null,
174 ObjectStatus::Scalar {
175 ref mut value_so_far,
176 },
177 'u',
178 ) if *value_so_far == vec!['n'] => {
179 value_so_far.push('u');
180 }
181 (
182 Value::Null,
183 ObjectStatus::Scalar {
184 ref mut value_so_far,
185 },
186 'l',
187 ) if *value_so_far == vec!['n', 'u'] => {
188 value_so_far.push('l');
189 }
190 (Value::Null, sts @ ObjectStatus::Scalar { .. }, 'l') => {
191 *sts = ObjectStatus::Closed;
192 }
193 (val @ Value::Null, sts @ ObjectStatus::Ready, c @ '0'..='9') => {
195 let digit = c.to_digit(10).ok_or_else(|| "invalid digit".to_string())?;
196 *val = Value::Number(digit.into());
197 *sts = ObjectStatus::ScalarNumber {
198 value_so_far: vec![c],
199 };
200 }
201 (val @ Value::Null, sts @ ObjectStatus::Ready, '-') => {
202 *val = Value::Number(0.into());
203 *sts = ObjectStatus::ScalarNumber {
204 value_so_far: vec!['-'],
205 };
206 }
207 (
208 Value::Number(ref mut num),
209 ObjectStatus::ScalarNumber {
210 ref mut value_so_far,
211 },
212 c @ '0'..='9',
213 ) => {
214 value_so_far.push(c);
215 if value_so_far.contains(&'.')
217 || value_so_far.contains(&'e')
218 || value_so_far.contains(&'E')
219 {
220 let parsed_number = value_so_far
221 .iter()
222 .collect::<String>()
223 .parse::<f64>()
224 .map_err(|e| e.to_string())?;
225
226 if let Some(json_number) = serde_json::Number::from_f64(parsed_number) {
227 *num = json_number;
228 }
229 } else {
230 let parsed_number = value_so_far
231 .iter()
232 .collect::<String>()
233 .parse::<i64>()
234 .map_err(|e| e.to_string())?;
235 *num = parsed_number.into();
236 }
237 }
238 (
239 Value::Number(_),
240 ObjectStatus::ScalarNumber {
241 ref mut value_so_far,
242 },
243 'e' | 'E',
244 ) => {
245 value_so_far.push(current_char);
246 }
247 (
248 Value::Number(_),
249 ObjectStatus::ScalarNumber {
250 ref mut value_so_far,
251 },
252 '+' | '-',
253 ) if matches!(value_so_far.last(), Some('e') | Some('E')) => {
254 value_so_far.push(current_char);
255 }
256 (
257 Value::Number(_),
258 ObjectStatus::ScalarNumber {
259 ref mut value_so_far,
260 },
261 '.',
262 ) => {
263 value_so_far.push('.');
264 }
265 (Value::Array(_), sts @ ObjectStatus::StartArray, ']') => {
267 *sts = ObjectStatus::Closed;
268 }
269 (Value::Array(_), ObjectStatus::StartArray, ' ' | '\n') => {}
270 (Value::Array(ref mut arr), sts @ ObjectStatus::StartArray, '"') => {
271 arr.push(json!(""));
272 *sts = ObjectStatus::ArrayValueQuoteOpen {
273 index: arr.len() - 1,
274 };
275 }
276 (Value::Array(ref mut arr), sts @ ObjectStatus::StartArray, char) => {
277 arr.push(Value::Null);
278 *sts = ObjectStatus::ArrayValueScalar {
279 index: arr.len() - 1,
280 value_so_far: vec![char],
281 };
282 }
283 (Value::Array(ref mut arr), sts @ ObjectStatus::ArrayValueQuoteOpen { .. }, '"') => {
284 let index = match *sts {
285 ObjectStatus::ArrayValueQuoteOpen { index } => index,
286 _ => unreachable!(),
287 };
288 if let Some(Value::String(s)) = arr.get_mut(index) {
289 if ends_with_odd_backslashes(s) {
290 s.push('"');
291 return Ok(());
292 }
293 *s = decode_json_string(s)?;
294 }
295 *sts = ObjectStatus::ArrayValueQuoteClose;
296 }
297 (Value::Array(ref mut arr), ObjectStatus::ArrayValueQuoteOpen { index }, char) => {
298 if let Some(Value::String(s)) = arr.get_mut(*index) {
299 s.push(char);
300 } else {
301 return Err("Invalid string value in array".to_string());
302 }
303 }
304 (Value::Array(_), ObjectStatus::ArrayValueQuoteClose, ' ' | '\n') => {}
305 (Value::Array(_), sts @ ObjectStatus::ArrayValueQuoteClose, ',') => {
306 *sts = ObjectStatus::StartArray;
307 }
308 (Value::Array(_), sts @ ObjectStatus::ArrayValueQuoteClose, ']') => {
309 *sts = ObjectStatus::Closed;
310 }
311 (Value::Array(ref mut arr), sts @ ObjectStatus::ArrayValueScalar { .. }, ',') => {
312 if let ObjectStatus::ArrayValueScalar {
313 index,
314 ref mut value_so_far,
315 } = sts
316 {
317 let value_string = value_so_far.iter().collect::<String>();
318 let idx = *index;
319 let value: Value = match value_string.parse::<Value>() {
320 Ok(v) => v,
321 Err(e) => return Err(format!("Invalid array value: {e}")),
322 };
323 arr[idx] = value;
324 }
325 *sts = ObjectStatus::StartArray;
326 }
327 (Value::Array(ref mut arr), sts @ ObjectStatus::ArrayValueScalar { .. }, ']') => {
328 if let ObjectStatus::ArrayValueScalar {
329 index,
330 ref mut value_so_far,
331 } = sts
332 {
333 let value_string = value_so_far.iter().collect::<String>();
334 let idx = *index;
335 let value: Value = match value_string.parse::<Value>() {
336 Ok(v) => v,
337 Err(e) => return Err(format!("Invalid array value: {e}")),
338 };
339 arr[idx] = value;
340 }
341 *sts = ObjectStatus::Closed;
342 }
343 (
344 Value::Array(_),
345 ObjectStatus::ArrayValueScalar {
346 ref mut value_so_far,
347 ..
348 },
349 char,
350 ) => {
351 value_so_far.push(char);
352 }
353 (Value::String(ref mut s), sts @ ObjectStatus::StringQuoteOpen, '"') => {
355 if ends_with_odd_backslashes(s) {
356 s.push('"');
357 } else {
358 *s = decode_json_string(s)?;
359 *sts = ObjectStatus::StringQuoteClose;
360 }
361 }
362 (Value::String(str), sts @ ObjectStatus::StringQuoteOpen, char) => {
363 str.push(char);
364 *sts = ObjectStatus::StringQuoteOpen;
365 }
366 (Value::Object(_obj), sts @ ObjectStatus::StartProperty, '"') => {
367 *sts = ObjectStatus::KeyQuoteOpen { key_so_far: vec![] };
368 }
369 (Value::Object(_obj), sts @ ObjectStatus::StartProperty, '}') => {
370 *sts = ObjectStatus::Closed;
371 }
372 (Value::Object(ref mut obj), sts @ ObjectStatus::KeyQuoteOpen { .. }, '"') => {
373 if let ObjectStatus::KeyQuoteOpen { key_so_far } = sts.clone() {
374 *sts = ObjectStatus::KeyQuoteClose {
375 key: key_so_far.clone(),
376 };
377 obj.insert(key_so_far.iter().collect::<String>(), Value::Null);
378 }
379 }
380 (Value::Object(_obj), ObjectStatus::KeyQuoteOpen { ref mut key_so_far }, char) => {
381 key_so_far.push(char);
382 }
383 (Value::Object(_obj), sts @ ObjectStatus::KeyQuoteClose { .. }, ':') => {
384 if let ObjectStatus::KeyQuoteClose { key } = sts.clone() {
385 *sts = ObjectStatus::Colon { key: key.clone() };
386 }
387 }
388 (Value::Object(_obj), ObjectStatus::Colon { .. }, ' ' | '\n' | '\t' | '\r') => {}
389 (Value::Object(ref mut obj), sts @ ObjectStatus::Colon { .. }, '"') => {
390 if let ObjectStatus::Colon { key } = sts.clone() {
391 *sts = ObjectStatus::ValueQuoteOpen { key: key.clone() };
392 obj.insert(key.iter().collect::<String>().clone(), json!(""));
394 }
395 }
396 (Value::Object(ref mut obj), sts @ ObjectStatus::ValueQuoteOpen { .. }, '"') => {
398 let key_vec = match sts {
399 ObjectStatus::ValueQuoteOpen { key } => key.clone(),
400 _ => unreachable!(),
401 };
402 let key_string = key_vec.iter().collect::<String>();
403 if let Some(Value::String(value)) = obj.get_mut(&key_string) {
404 if ends_with_odd_backslashes(value) {
405 value.push('"');
406 return Ok(());
407 }
408 *value = decode_json_string(value)?;
409 }
410 *sts = ObjectStatus::ValueQuoteClose;
411 }
412 (Value::Object(ref mut obj), ObjectStatus::ValueQuoteOpen { key }, char) => {
413 let key_string = key.iter().collect::<String>();
414 let value = obj
415 .get_mut(&key_string)
416 .ok_or_else(|| format!("missing key {key_string}"))?;
417 match value {
418 Value::String(value) => {
419 value.push(char);
420 }
421 _ => {
422 return Err(format!("Invalid value type for key {key_string}"));
423 }
424 }
425 }
426
427 (Value::Object(_obj), sts @ ObjectStatus::Colon { .. }, char) => {
429 if let ObjectStatus::Colon { key } = sts.clone() {
430 *sts = ObjectStatus::ValueScalar {
431 key: key.clone(),
432 value_so_far: vec![char],
433 };
434 }
435 }
436 (Value::Object(ref mut obj), sts @ ObjectStatus::ValueScalar { .. }, ',') => {
437 if let ObjectStatus::ValueScalar { key, value_so_far } = sts.clone() {
438 let key_string = key.iter().collect::<String>();
439 let value_string = value_so_far.iter().collect::<String>();
440 let value = match value_string.parse::<Value>() {
441 Ok(value) => value,
442 Err(e) => {
443 return Err(format!("Invalid value for key {key_string}: {e}"));
444 }
445 };
446 obj.insert(key_string, value);
447 *sts = ObjectStatus::StartProperty;
448 }
449 }
450 (Value::Object(ref mut obj), sts @ ObjectStatus::ValueScalar { .. }, '}') => {
451 if let ObjectStatus::ValueScalar { key, value_so_far } = sts.clone() {
452 let key_string = key.iter().collect::<String>();
453 let value_string = value_so_far.iter().collect::<String>();
454 let value = match value_string.parse::<Value>() {
455 Ok(value) => value,
456 Err(e) => {
457 return Err(format!("Invalid value for key {key_string}: {e}"));
458 }
459 };
460 obj.insert(key_string, value);
461 *sts = ObjectStatus::Closed;
462 }
463 }
464 (Value::Object(_obj), ObjectStatus::ValueScalar { .. }, ' ' | '\n' | '\t' | '\r') => {}
465 (
466 Value::Object(_obj),
467 ObjectStatus::ValueScalar {
468 key: _key,
469 ref mut value_so_far,
470 },
471 char,
472 ) => {
473 value_so_far.push(char);
475 }
476
477 (Value::Object(_obj), sts @ ObjectStatus::ValueQuoteClose, ',') => {
479 *sts = ObjectStatus::StartProperty;
480 }
481 (Value::Object(_obj), sts @ ObjectStatus::ValueQuoteClose, '}') => {
482 *sts = ObjectStatus::Closed;
483 }
484 (_, _, ' ' | '\n' | '\t' | '\r') => {}
486 (_val, st, c) => {
487 return Err(format!("Invalid character {c} status: {st:?}"));
488 }
489 }
490
491 Ok(())
492}
493
494fn add_char_into_object(
495 stack: &mut Vec<(Value, ObjectStatus)>,
496 current_char: char,
497) -> Result<(), String> {
498 if stack.is_empty() {
499 return Err("empty stack".to_string());
500 }
501
502 {
504 let (value, status) = stack.last_mut().unwrap();
505 match (value, current_char) {
506 (Value::Array(_), '{') if matches!(status, ObjectStatus::StartArray) => {
507 *status = ObjectStatus::ArrayValueNested;
508 stack.push((Value::Null, ObjectStatus::Ready));
509 return add_char_into_object(stack, '{');
510 }
511 (Value::Array(_), '[') if matches!(status, ObjectStatus::StartArray) => {
512 *status = ObjectStatus::ArrayValueNested;
513 stack.push((Value::Null, ObjectStatus::Ready));
514 return add_char_into_object(stack, '[');
515 }
516 (Value::Object(_), '{') => {
517 if let ObjectStatus::Colon { key } = status {
518 let key_clone = key.clone();
519 *status = ObjectStatus::ValueNested {
520 key: key_clone.clone(),
521 };
522 stack.push((Value::Null, ObjectStatus::Ready));
523 return add_char_into_object(stack, '{');
524 }
525 }
526 (Value::Object(_), '[') => {
527 if let ObjectStatus::Colon { key } = status {
528 let key_clone = key.clone();
529 *status = ObjectStatus::ValueNested {
530 key: key_clone.clone(),
531 };
532 stack.push((Value::Null, ObjectStatus::Ready));
533 return add_char_into_object(stack, '[');
534 }
535 }
536 _ => {}
537 }
538 }
539
540 {
541 let (ref mut val, ref mut status) = stack.last_mut().unwrap();
542 process_char(val, status, current_char)?;
543 }
544
545 while stack.len() > 1 {
547 let should_pop = matches!(stack.last(), Some((_, ObjectStatus::Closed)));
548 if !should_pop {
549 break;
550 }
551 let (completed_value, _) = stack.pop().unwrap();
552 let (parent_value, parent_status) = stack.last_mut().unwrap();
553 match parent_status {
554 ObjectStatus::ArrayValueNested => {
555 if let Value::Array(arr) = parent_value {
556 arr.push(completed_value);
557 *parent_status = ObjectStatus::ArrayValueQuoteClose;
558 } else {
559 return Err("Parent is not array".to_string());
560 }
561 }
562 ObjectStatus::ValueNested { key } => {
563 if let Value::Object(map) = parent_value {
564 map.insert(key.iter().collect::<String>(), completed_value);
565 *parent_status = ObjectStatus::ValueQuoteClose;
566 } else {
567 return Err("Parent is not object".to_string());
568 }
569 }
570 _ => {
571 return Err("Invalid parent status".to_string());
572 }
573 }
574 }
575
576 Ok(())
577}
578
579#[cfg(debug_assertions)]
580pub fn parse_stream(json_string: &str) -> Result<Value, String> {
581 let mut stack: Vec<(Value, ObjectStatus)> = vec![(Value::Null, ObjectStatus::Ready)];
582 for current_char in json_string.chars() {
583 let (ref val, ref st) = stack.last().unwrap();
584 println!(
585 "variables: {:?} {:?} {:?}",
586 val,
587 st.clone(),
588 current_char.to_string()
589 );
590 add_char_into_object(&mut stack, current_char)?;
591 }
592 Ok(stack.pop().unwrap().0)
593}
594
595#[cfg(not(debug_assertions))]
596pub fn parse_stream(json_string: &str) -> Result<Value, String> {
597 let mut stack: Vec<(Value, ObjectStatus)> = vec![(Value::Null, ObjectStatus::Ready)];
598 for current_char in json_string.chars() {
599 add_char_into_object(&mut stack, current_char)?;
600 }
601 Ok(stack.pop().unwrap().0)
602}
603
604pub fn parse_stream_with_limits(
605 json_string: &str,
606 max_depth: Option<usize>,
607 max_length: Option<usize>,
608) -> Result<Value, String> {
609 let mut parser = JsonStreamParser::with_limits(max_depth, max_length);
610 for c in json_string.chars() {
611 parser.add_char(c)?;
612 }
613 Ok(parser.stack.pop().unwrap().0)
614}
615
616pub struct JsonStreamParser {
617 stack: Vec<(Value, ObjectStatus)>,
618 processed_chars: usize,
619 max_depth: Option<usize>,
620 max_length: Option<usize>,
621}
622
623impl Default for JsonStreamParser {
624 fn default() -> Self {
625 Self::new()
626 }
627}
628
629impl JsonStreamParser {
630 pub fn new() -> JsonStreamParser {
631 Self::with_limits(None, None)
632 }
633
634 pub fn with_limits(max_depth: Option<usize>, max_length: Option<usize>) -> JsonStreamParser {
635 JsonStreamParser {
636 stack: vec![(Value::Null, ObjectStatus::Ready)],
637 processed_chars: 0,
638 max_depth,
639 max_length,
640 }
641 }
642
643 pub fn add_char(&mut self, current_char: char) -> Result<(), String> {
644 if let Some(limit) = self.max_length {
645 self.processed_chars += 1;
646 if self.processed_chars > limit {
647 return Err("input length limit exceeded".to_string());
648 }
649 }
650
651 add_char_into_object(&mut self.stack, current_char)?;
652
653 if let Some(max_depth) = self.max_depth {
654 if self.stack.len() > max_depth {
655 return Err("max depth exceeded".to_string());
656 }
657 }
658
659 Ok(())
660 }
661
662 pub fn get_result(&self) -> &Value {
663 &self.stack[0].0
664 }
665}
666
667macro_rules! param_test {
676 ($($name:ident: $string:expr, $value:expr)*) => {
677 $(
678 #[cfg(test)]
679 mod $name {
680 use super::{parse_stream, JsonStreamParser};
681 use serde_json::{Value, json};
682
683 #[test]
684 fn simple() {
685 let string: &str = $string;
686 let value: Value = $value;
687 let result = parse_stream(&string);
688 assert_eq!(result.unwrap(), value);
689 let mut parser = JsonStreamParser::new();
690 for c in string.chars() {
691 parser.add_char(c).unwrap();
692 }
693 assert_eq!(parser.get_result(), &value);
694 }
695
696 #[test]
697 fn object_single_key_value() {
698 let string = $string;
699 let value = $value;
700 let raw_json = format!("{{\"key\": {}}}", string);
701 let expected = json!({"key": value});
702 let result = parse_stream(&raw_json);
703 assert_eq!(result.unwrap(), expected);
704 let mut parser = JsonStreamParser::new();
705 for c in raw_json.chars() {
706 parser.add_char(c).unwrap();
707 }
708 assert_eq!(parser.get_result(), &expected);
709 }
710
711 #[test]
712 fn object_multiple_key_value() {
713 let string = $string;
714 let value = $value;
715 let raw_json = format!("{{\"key1\": {}, \"key2\": {}}}", string, string);
716 let expected = json!({"key1": value, "key2": value});
717 let result = parse_stream(&raw_json);
718 assert_eq!(result.unwrap(), expected);
719 let mut parser = JsonStreamParser::new();
720 for c in raw_json.chars() {
721 parser.add_char(c).unwrap();
722 }
723 assert_eq!(parser.get_result(), &expected);
724 }
725
726 #[test]
727 fn object_multiple_key_value_with_blank_1() {
728 let string = $string;
729 let value = $value;
730 let raw_json = format!("{{ \"key1\": {}, \"key2\": {}}}", string, string);
731 let expected = json!({"key1": value, "key2": value});
732 let result = parse_stream(&raw_json);
733 assert_eq!(result.unwrap(), expected);
734 let mut parser = JsonStreamParser::new();
735 for c in raw_json.chars() {
736 parser.add_char(c).unwrap();
737 }
738 assert_eq!(parser.get_result(), &expected);
739 }
740
741 #[test]
742 fn object_multiple_key_value_with_blank_2() {
743 let string = $string;
744 let value = $value;
745 let raw_json = format!("{{\"key1\": {}, \"key2\": {} }}", string, string);
746 let expected = json!({"key1": value, "key2": value});
747 let result = parse_stream(&raw_json);
748 assert_eq!(result.unwrap(), expected);
749 let mut parser = JsonStreamParser::new();
750 for c in raw_json.chars() {
751 parser.add_char(c).unwrap();
752 }
753 assert_eq!(parser.get_result(), &expected);
754 }
755
756 #[test]
757 fn object_multiple_key_value_with_blank_3() {
758 let string = $string;
759 let value = $value;
760 let raw_json = format!("{{
761 \"key1\": {} ,
762 \"key2\": {}
763 }}", string, string);
764 let expected = json!({"key1": value, "key2": value});
765 let result = parse_stream(&raw_json);
766 assert_eq!(result.unwrap(), expected);
767 let mut parser = JsonStreamParser::new();
768 for c in raw_json.chars() {
769 parser.add_char(c).unwrap();
770 }
771 assert_eq!(parser.get_result(), &expected);
772 }
773
774 #[test]
775 fn array_single_value() {
776 let string = $string;
777 let value = $value;
778 let raw_json = format!("[{}]", string);
779 let expected = json!([value]);
780 let result = parse_stream(&raw_json);
781 assert_eq!(result.unwrap(), expected);
782 let mut parser = JsonStreamParser::new();
783 for c in raw_json.chars() {
784 parser.add_char(c).unwrap();
785 }
786 assert_eq!(parser.get_result(), &expected);
787 }
788
789 #[test]
790 fn array_multiple_values() {
791 let string = $string;
792 let value = $value;
793 let raw_json = format!("[{}, {}]", string, string);
794 let expected = json!([value.clone(), value]);
795 let result = parse_stream(&raw_json);
796 assert_eq!(result.unwrap(), expected);
797 let mut parser = JsonStreamParser::new();
798 for c in raw_json.chars() {
799 parser.add_char(c).unwrap();
800 }
801 assert_eq!(parser.get_result(), &expected);
802 }
803
804 #[test]
805 fn array_multiple_values_with_blank_1() {
806 let string = $string;
807 let value = $value;
808 let raw_json = format!("[ {}, {}]", string, string);
809 let expected = json!([value.clone(), value]);
810 let result = parse_stream(&raw_json);
811 assert_eq!(result.unwrap(), expected);
812 let mut parser = JsonStreamParser::new();
813 for c in raw_json.chars() {
814 parser.add_char(c).unwrap();
815 }
816 assert_eq!(parser.get_result(), &expected);
817 }
818
819 #[test]
820 fn array_multiple_values_with_blank_2() {
821 let string = $string;
822 let value = $value;
823 let raw_json = format!("[{}, {} ]", string, string);
824 let expected = json!([value.clone(), value]);
825 let result = parse_stream(&raw_json);
826 assert_eq!(result.unwrap(), expected);
827 let mut parser = JsonStreamParser::new();
828 for c in raw_json.chars() {
829 parser.add_char(c).unwrap();
830 }
831 assert_eq!(parser.get_result(), &expected);
832 }
833
834 #[test]
835 fn array_multiple_values_with_blank_3() {
836 let string = $string;
837 let value = $value;
838 let raw_json = format!("[\n {},\n {}\n]", string, string);
839 let expected = json!([value.clone(), value]);
840 let result = parse_stream(&raw_json);
841 assert_eq!(result.unwrap(), expected);
842 let mut parser = JsonStreamParser::new();
843 for c in raw_json.chars() {
844 parser.add_char(c).unwrap();
845 }
846 assert_eq!(parser.get_result(), &expected);
847 }
848 }
849 )*
850 }
851}
852
853param_test! {
854 null: r#"null"#, Value::Null
855 true_value: r#"true"#, Value::Bool(true)
856 false_value: r#"false"#, Value::Bool(false)
857 empty_string: r#""""#, Value::String("".to_string())
858 single_character_string: r#""a""#, Value::String("a".to_string())
859 string_with_escaped_quote: r#""a\"b""#, Value::String("a\"b".to_string())
860 string_with_spaces: r#""a b c""#, Value::String("a b c".to_string())
861 string_with_space_at_end: r#""a b c ""#, Value::String("a b c ".to_string())
862 string_with_space_at_start: r#"" a b c""#, Value::String(" a b c".to_string())
863 string_with_space_at_start_and_end: r#"" a b c ""#, Value::String(" a b c ".to_string())
864 number: r#"1234567890"#, Value::Number(1234567890.into())
865 single_digit_number: r#"1"#, Value::Number(1.into())
866 number_with_spaces_at_start: r#" 1234567890"#, Value::Number(1234567890.into())
867 number_with_spaces_at_end: r#"1234567890 "#, Value::Number(1234567890.into())
868 number_with_spaces_at_start_and_end: r#" 1234567890 "#, Value::Number(1234567890.into())
869 negative_number: r#"-1234567890"#, Value::Number((-1234567890).into())
870 negative_single_digit_number: r#"-1"#, Value::Number((-1).into())
871 zero: r#"0"#, Value::Number(0.into())
872 float: r#"123.456"#, Value::Number(serde_json::Number::from_f64(123.456).unwrap())
873 negative_float: r#"-123.456"#, Value::Number(serde_json::Number::from_f64(-123.456).unwrap())
874 exponent_positive: r#"1e2"#, Value::Number(serde_json::Number::from_f64(100.0).unwrap())
875 exponent_negative: r#"1e-2"#, Value::Number(serde_json::Number::from_f64(0.01).unwrap())
876 exponent_positive_decimal: r#"1.5e2"#, Value::Number(serde_json::Number::from_f64(150.0).unwrap())
877 exponent_negative_decimal: r#"1.5e-2"#, Value::Number(serde_json::Number::from_f64(0.015).unwrap())
878 tab_whitespace_number: "\t123\t", Value::Number(123.into())
879 carriage_return_whitespace_number: "\r123\r", Value::Number(123.into())
880 nested_array_value: "[[1]]", json!([[1]])
881 deep_nested_array_value: "[[[1]]]", json!([[[1]]])
882 empty_object: r#"{}"#, json!({})
883 nested_object_value: r#"{"a":{"b":1}}"#, json!({"a": {"b": 1 }})
884 deep_nested_object_value: r#"{"a":{"b":{"c":1}}}"#, json!({"a": {"b": {"c": 1 }}})
885}
886
887#[cfg(test)]
888mod array_tests {
889 use super::{parse_stream, JsonStreamParser};
890 use serde_json::json;
891
892 #[test]
893 fn empty_array() {
894 let raw_json = "[]";
895 let expected = json!([]);
896 let result = parse_stream(raw_json);
897 assert_eq!(result.unwrap(), expected);
898 let mut parser = JsonStreamParser::new();
899 for c in raw_json.chars() {
900 parser.add_char(c).unwrap();
901 }
902 assert_eq!(parser.get_result(), &expected);
903 }
904
905 #[test]
906 fn array_as_object_value() {
907 let raw_json = "{\"items\": []}";
908 let expected = json!({"items": []});
909 let result = parse_stream(raw_json);
910 assert_eq!(result.unwrap(), expected);
911 let mut parser = JsonStreamParser::new();
912 for c in raw_json.chars() {
913 parser.add_char(c).unwrap();
914 }
915 assert_eq!(parser.get_result(), &expected);
916 }
917
918 #[test]
919 fn array_with_nested_object() {
920 let raw_json = "[{\"a\":1}]";
921 let expected = json!([{"a":1}]);
922 let result = parse_stream(raw_json);
923 assert_eq!(result.unwrap(), expected);
924 let mut parser = JsonStreamParser::new();
925 for c in raw_json.chars() {
926 parser.add_char(c).unwrap();
927 }
928 assert_eq!(parser.get_result(), &expected);
929 }
930
931 #[test]
932 fn array_with_nested_array() {
933 let raw_json = "[[1,2],[3]]";
934 let expected = json!([[1, 2], [3]]);
935 let result = parse_stream(raw_json);
936 assert_eq!(result.unwrap(), expected);
937 let mut parser = JsonStreamParser::new();
938 for c in raw_json.chars() {
939 parser.add_char(c).unwrap();
940 }
941 assert_eq!(parser.get_result(), &expected);
942 }
943
944 #[test]
945 fn object_with_nested_object() {
946 let raw_json = "{\"obj\":{\"b\":1}}";
947 let expected = json!({"obj": {"b":1}});
948 let result = parse_stream(raw_json);
949 assert_eq!(result.unwrap(), expected);
950 let mut parser = JsonStreamParser::new();
951 for c in raw_json.chars() {
952 parser.add_char(c).unwrap();
953 }
954 assert_eq!(parser.get_result(), &expected);
955 }
956
957 #[test]
958 fn object_with_nested_array() {
959 let raw_json = "{\"arr\": [1, 2, 3]}";
960 let expected = json!({"arr": [1, 2, 3]});
961 let result = parse_stream(raw_json);
962 assert_eq!(result.unwrap(), expected);
963 let mut parser = JsonStreamParser::new();
964 for c in raw_json.chars() {
965 parser.add_char(c).unwrap();
966 }
967 assert_eq!(parser.get_result(), &expected);
968 }
969
970 #[test]
971 fn object_with_deep_nesting() {
972 let raw_json = "{\"data\": [{\"vals\": [1]}]}";
973 let expected = json!({"data": [{"vals": [1]}]});
974 let result = parse_stream(raw_json);
975 assert_eq!(result.unwrap(), expected);
976 let mut parser = JsonStreamParser::new();
977 for c in raw_json.chars() {
978 parser.add_char(c).unwrap();
979 }
980 assert_eq!(parser.get_result(), &expected);
981 }
982
983 #[test]
984 fn object_with_extra_deep_nesting() {
985 let raw_json = "{\"data\": [{\"vals\": [{\"deep\": [1]}]}]}";
986 let expected = json!({"data": [{"vals": [{"deep": [1]}]}]});
987 let result = parse_stream(raw_json);
988 assert_eq!(result.unwrap(), expected);
989 let mut parser = JsonStreamParser::new();
990 for c in raw_json.chars() {
991 parser.add_char(c).unwrap();
992 }
993 assert_eq!(parser.get_result(), &expected);
994 }
995}