json_stream_parser/
lib.rs

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    // We are ready to start a new object.
14    Ready,
15    // We are in the beginning of a string, likely because we just received an opening quote.
16    StringQuoteOpen,
17    // We just finished a string, likely because we just received a closing quote.
18    StringQuoteClose,
19    // We are in the middle of a scalar value, likely because we just received a digit.
20    Scalar {
21        value_so_far: Vec<char>,
22    },
23    ScalarNumber {
24        value_so_far: Vec<char>,
25    },
26    // We just started an array, after receiving an opening bracket.
27    StartArray,
28    // We are in the beginning of an array string value.
29    ArrayValueQuoteOpen {
30        index: usize,
31    },
32    // We just closed an array string value.
33    ArrayValueQuoteClose,
34    // We are taking an array scalar value (numbers, booleans, etc.).
35    ArrayValueScalar {
36        index: usize,
37        value_so_far: Vec<char>,
38    },
39    // A nested object/array being parsed inside an array
40    ArrayValueNested,
41    // We just started a property, likely because we just received an opening brace or a comma in case of an existing object.
42    StartProperty,
43    // We are in the beginning of a key, likely because we just received a quote. We need to store the key_so_far because
44    // unlike the value, we cannot add the key to the object until it is complete.
45    KeyQuoteOpen {
46        key_so_far: Vec<char>,
47    },
48    // We just finished a key, likely because we just received a closing quote.
49    KeyQuoteClose {
50        key: Vec<char>,
51    },
52    // We just finished a key, likely because we just received a colon.
53    Colon {
54        key: Vec<char>,
55    },
56    // We are in the beginning of a value, likely because we just received a quote.
57    ValueQuoteOpen {
58        key: Vec<char>,
59        // We don't need to store the valueSoFar because we can add the value to the object immediately.
60    },
61    ValueQuoteClose,
62
63    // We are taking any value that is not a string. For these case we just store
64    // each character until we reach a comma or a closing brace and then we pare
65    // and add the value to the object.
66    ValueScalar {
67        key: Vec<char>,
68        value_so_far: Vec<char>,
69    },
70    // A nested object/array being parsed as a property value
71    ValueNested {
72        key: Vec<char>,
73    },
74
75    // We just finished the object, likely because we just received a closing brace.
76    Closed,
77}
78
79// this function takes and existing object that we are building along with a single character as we as an address
80// to the current position in the object that we are in and returns the object with that character added along with
81// the new address.
82fn 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        // ------ true ------
101        (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        // ------ false ------
129        (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        // ------ null ------
166        (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        // ------ number ------
194        (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 the number contains a decimal point or an exponent, parse as f64
216            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        // ------ array ------
266        (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        // ------ string ------
354        (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                // create an empty string for the value
393                obj.insert(key.iter().collect::<String>().clone(), json!(""));
394            }
395        }
396        // ------ Add String Value ------
397        (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        // ------ Add Scalar Value ------
428        (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            // push the character into the value so far
474            value_so_far.push(char);
475        }
476
477        // ------ Finished taking value ------
478        (Value::Object(_obj), sts @ ObjectStatus::ValueQuoteClose, ',') => {
479            *sts = ObjectStatus::StartProperty;
480        }
481        (Value::Object(_obj), sts @ ObjectStatus::ValueQuoteClose, '}') => {
482            *sts = ObjectStatus::Closed;
483        }
484        // ------ white spaces ------
485        (_, _, ' ' | '\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    // check if we need to start a nested context without cloning status
503    {
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    // handle closed contexts
546    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
667// The `param_test!` macro defines a suite of parameterized tests. Each entry
668// provides a JSON snippet (`$string`) and the `serde_json::Value` (`$value`)
669// expected after parsing. The macro expands into a module per entry containing
670// multiple tests:
671//   * parsing the snippet on its own
672//   * the snippet as a value in objects
673//   * the snippet embedded inside arrays
674// This approach ensures consistent coverage across many JSON value types.
675macro_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}