json_five/
de.rs

1use serde::de::{self, DeserializeSeed, Deserialize, Deserializer, MapAccess, SeqAccess, VariantAccess, Visitor};
2use std::fmt;
3use crate::parser::{JSONValue, JSONKeyValuePair, UnaryOperator, from_str as model_from_str};
4use crate::utils::unescape;
5#[derive(Debug)]
6pub enum SerdeJSON5Error {
7    Custom(String),
8}
9
10impl fmt::Display for SerdeJSON5Error {
11    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12        match self {
13            SerdeJSON5Error::Custom(msg) => write!(f, "{}", msg),
14        }
15    }
16}
17
18impl std::error::Error for SerdeJSON5Error {}
19
20impl de::Error for SerdeJSON5Error {
21    fn custom<T: fmt::Display>(msg: T) -> Self {
22        SerdeJSON5Error::Custom(msg.to_string())
23    }
24}
25
26/// A small helper that wraps our `JSONValue` and implements
27/// `serde::Deserializer`.
28pub struct JSONValueDeserializer<'a> {
29    input: &'a JSONValue<'a>,
30}
31
32
33
34impl<'de, 'a> Deserializer<'de> for JSONValueDeserializer<'a> {
35    type Error = SerdeJSON5Error;
36
37    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
38    where
39        V: Visitor<'de>,
40    {
41        match self.input {
42            JSONValue::Null => visitor.visit_unit(),
43            JSONValue::Bool(b) => visitor.visit_bool(*b),
44            JSONValue::DoubleQuotedString(s) | JSONValue::SingleQuotedString(s) => {
45                visitor.visit_str(unescape(s).unwrap().as_str())
46            }
47            JSONValue::Identifier(s) => visitor.visit_str(unescape(s).unwrap().as_str()),
48            JSONValue::JSONObject { key_value_pairs } => {
49                // Treat as a map
50                let mut map_deserializer = JSONMapAccess {
51                    pairs: key_value_pairs,
52                    index: 0,
53                };
54                visitor.visit_map(&mut map_deserializer)
55            }
56            JSONValue::JSONArray { values } => {
57                let mut seq_deserializer = JSONSeqAccess {
58                    values,
59                    index: 0,
60                };
61                visitor.visit_seq(&mut seq_deserializer)
62            }
63            JSONValue::Integer(s) => {
64                // Attempt to parse as i64, or fallback to bigger integer handling as needed
65                if let Ok(i) = s.parse::<i64>() {
66                    visitor.visit_i64(i)
67                } else {
68                    // if it doesn't parse to i64, try as u64 or fallback to string
69                    if let Ok(u) = s.parse::<u64>() {
70                        visitor.visit_u64(u)
71                    } else {
72                        // fallback: treat as a string or produce an error
73                        Err(de::Error::custom(format!("Invalid integer {}", s)))
74                    }
75                }
76            }
77            JSONValue::Float(s) | JSONValue::Exponent(s) => {
78                // For floats (including exponent):
79                if let Ok(f) = s.parse::<f64>() {
80                    visitor.visit_f64(f)
81                } else {
82                    Err(de::Error::custom(format!("Invalid float {}", s)))
83                }
84            }
85            JSONValue::Infinity => visitor.visit_f64(f64::INFINITY),
86            JSONValue::NaN => visitor.visit_f64(f64::NAN),
87            JSONValue::Hexadecimal(s) => {
88                // Optionally convert to integer, or treat as string
89                match u64::from_str_radix(s.trim_start_matches("0x"), 16) {
90                    Ok(hex) => {
91                        visitor.visit_u64(hex)
92                    }
93                    Err(e) => {
94                        Err(de::Error::custom(format!("Invalid hex {}", e)))
95                    }
96                }
97            }
98            JSONValue::Unary { operator, value } => {
99                let sign = match operator {
100                    UnaryOperator::Plus => 1.0,
101                    UnaryOperator::Minus => -1.0,
102                };
103                let inner_de = JSONValueDeserializer { input: &**value };
104                let number: f64 = Deserialize::deserialize(inner_de)?;
105                visitor.visit_f64(sign * number)
106            }
107        }
108    }
109
110    // --- The following methods “forward” to deserialize_any by default. ---
111    // --- For efficiency/clarity, you can implement them specifically.  ---
112
113    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
114    where
115        V: Visitor<'de>,
116    {
117        self.deserialize_any(visitor)
118    }
119
120    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
121    where
122        V: Visitor<'de>
123    {
124        self.deserialize_any(visitor)
125    }
126
127    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
128    where
129        V: Visitor<'de>
130    {
131        self.deserialize_any(visitor)
132    }
133
134    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
135    where
136        V: Visitor<'de>
137    {
138        self.deserialize_any(visitor)
139    }
140
141    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
142    where
143        V: Visitor<'de>,
144    {
145        // Example: if we have an integer string, parse to i64
146        match self.input {
147            JSONValue::Integer(s) => {
148                let i = s.parse::<i64>().map_err(de::Error::custom)?;
149                visitor.visit_i64(i)
150            }
151            _ => self.deserialize_any(visitor),
152        }
153    }
154
155    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
156    where
157        V: Visitor<'de>
158    {
159        self.deserialize_any(visitor)
160    }
161
162    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
163    where
164        V: Visitor<'de>
165    {
166        self.deserialize_any(visitor)
167    }
168
169    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
170    where
171        V: Visitor<'de>
172    {
173        self.deserialize_any(visitor)
174    }
175
176    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
177    where
178        V: Visitor<'de>
179    {
180        self.deserialize_any(visitor)
181    }
182
183    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
184    where
185        V: Visitor<'de>
186    {
187        self.deserialize_any(visitor)
188    }
189
190    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
191    where
192        V: Visitor<'de>,
193    {
194        match self.input {
195            JSONValue::Float(s) | JSONValue::Exponent(s) => {
196                let f = s.parse::<f64>().map_err(de::Error::custom)?;
197                visitor.visit_f64(f)
198            }
199            JSONValue::Infinity => visitor.visit_f64(f64::INFINITY),
200            JSONValue::NaN => visitor.visit_f64(f64::NAN),
201            _ => self.deserialize_any(visitor),
202        }
203    }
204
205    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
206    where
207        V: Visitor<'de>
208    {
209        self.deserialize_any(visitor)
210    }
211
212    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
213    where
214        V: Visitor<'de>
215    {
216        self.deserialize_any(visitor)
217    }
218
219    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
220    where
221        V: Visitor<'de>
222    {
223        self.deserialize_any(visitor)
224    }
225
226    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
227    where
228        V: Visitor<'de>
229    {
230        self.deserialize_any(visitor)
231    }
232
233    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
234    where
235        V: Visitor<'de>
236    {
237        self.deserialize_any(visitor)
238    }
239
240    // The rest are standard boilerplate.
241    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
242    where
243        V: Visitor<'de>,
244    {
245        match self.input {
246            JSONValue::Null => visitor.visit_none(),
247            _ => visitor.visit_some(self),
248        }
249    }
250
251    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
252    where
253        V: Visitor<'de>,
254    {
255        if let JSONValue::Null = self.input {
256            visitor.visit_unit()
257        } else {
258            self.deserialize_any(visitor)
259        }
260    }
261
262    fn deserialize_unit_struct<V>(
263        self,
264        _name: &'static str,
265        visitor: V,
266    ) -> Result<V::Value, Self::Error>
267    where
268        V: Visitor<'de>,
269    {
270        self.deserialize_unit(visitor)
271    }
272
273    fn deserialize_newtype_struct<V>(
274        self,
275        _name: &'static str,
276        visitor: V,
277    ) -> Result<V::Value, Self::Error>
278    where
279        V: Visitor<'de>,
280    {
281        visitor.visit_newtype_struct(self)
282    }
283
284    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
285    where
286        V: Visitor<'de>,
287    {
288        match self.input {
289            JSONValue::JSONArray { values } => {
290                let mut seq = JSONSeqAccess {
291                    values,
292                    index: 0,
293                };
294                visitor.visit_seq(&mut seq)
295            }
296            _ => self.deserialize_any(visitor),
297        }
298    }
299
300    fn deserialize_tuple<V>(
301        self,
302        _len: usize,
303        visitor: V,
304    ) -> Result<V::Value, Self::Error>
305    where
306        V: Visitor<'de>,
307    {
308        self.deserialize_seq(visitor)
309    }
310
311    fn deserialize_tuple_struct<V>(
312        self,
313        _name: &'static str,
314        _len: usize,
315        visitor: V,
316    ) -> Result<V::Value, Self::Error>
317    where
318        V: Visitor<'de>,
319    {
320        self.deserialize_seq(visitor)
321    }
322
323    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
324    where
325        V: Visitor<'de>,
326    {
327        match self.input {
328            JSONValue::JSONObject { key_value_pairs } => {
329                let mut map = JSONMapAccess {
330                    pairs: key_value_pairs,
331                    index: 0,
332                };
333                visitor.visit_map(&mut map)
334            }
335            _ => self.deserialize_any(visitor),
336        }
337    }
338
339    fn deserialize_struct<V>(
340        self,
341        _name: &'static str,
342        _fields: &'static [&'static str],
343        visitor: V,
344    ) -> Result<V::Value, Self::Error>
345    where
346        V: Visitor<'de>,
347    {
348        self.deserialize_map(visitor)
349    }
350
351    fn deserialize_enum<V>(
352        self,
353        _name: &'static str,
354        _variants: &'static [&'static str],
355        visitor: V,
356    ) -> Result<V::Value, Self::Error>
357    where
358        V: Visitor<'de>,
359    {
360        // If you do not need enum support, you can skip or error out here.
361        // Otherwise interpret your JSONValue in a way that corresponds to an enum
362        // in user code.
363        use serde::de::IntoDeserializer;
364        match self.input {
365            JSONValue::Identifier(ident) => {
366                // We'll treat the entire enum as a single variant with no payload:
367                visitor.visit_enum(ident.into_deserializer())
368            }
369            JSONValue::JSONObject { key_value_pairs } if !key_value_pairs.is_empty() => {
370                // Possibly the first key is your variant, the value is the data.
371                // Example pattern for `Tag: { /* contents */ }` style
372                let kv = &key_value_pairs[0];
373                if let JSONValue::Identifier(ref variant) = kv.key {
374                    visitor.visit_enum(EnumDeserializer {
375                        variant,
376                        content: &kv.value,
377                    })
378                } else {
379                    Err(de::Error::custom("Invalid enum representation"))
380                }
381            }
382            _ => Err(de::Error::custom("Unsupported enum representation")),
383        }
384    }
385
386    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
387    where
388        V: Visitor<'de>,
389    {
390        match self.input {
391            JSONValue::Identifier(s)
392            | JSONValue::DoubleQuotedString(s)
393            | JSONValue::SingleQuotedString(s) => visitor.visit_str(unescape(s).unwrap().as_str()),
394            _ => self.deserialize_any(visitor),
395        }
396    }
397
398    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
399    where
400        V: Visitor<'de>,
401    {
402        visitor.visit_unit()
403    }
404}
405
406/// Minimal SeqAccess implementation for arrays
407struct JSONSeqAccess<'a> {
408    values: &'a [JSONValue<'a>],
409    index: usize,
410}
411
412impl<'de, 'a> SeqAccess<'de> for JSONSeqAccess<'a> {
413    type Error = SerdeJSON5Error;
414
415    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, SerdeJSON5Error>
416    where
417        T: DeserializeSeed<'de>,
418    {
419        if self.index < self.values.len() {
420            let deserializer = JSONValueDeserializer {
421                input: &self.values[self.index],
422            };
423            self.index += 1;
424            seed.deserialize(deserializer).map(Some)
425        } else {
426            Ok(None)
427        }
428    }
429}
430
431/// Minimal MapAccess implementation for objects
432struct JSONMapAccess<'a> {
433    pairs: &'a [JSONKeyValuePair<'a>],
434    index: usize,
435}
436
437impl<'de, 'a> MapAccess<'de> for JSONMapAccess<'a> {
438    type Error = SerdeJSON5Error;
439
440    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, SerdeJSON5Error>
441    where
442        K: DeserializeSeed<'de>,
443    {
444        if self.index < self.pairs.len() {
445            let deserializer = JSONValueDeserializer {
446                input: &self.pairs[self.index].key,
447            };
448            seed.deserialize(deserializer).map(Some)
449        } else {
450            Ok(None)
451        }
452    }
453
454    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, SerdeJSON5Error>
455    where
456        V: DeserializeSeed<'de>,
457    {
458        let deserializer = JSONValueDeserializer {
459            input: &self.pairs[self.index].value,
460        };
461        self.index += 1;
462        seed.deserialize(deserializer)
463    }
464}
465
466/// If you need to handle complex enum representations:
467struct EnumDeserializer<'a> {
468    variant: &'a str,
469    content: &'a JSONValue<'a>,
470}
471
472impl<'de, 'a> de::EnumAccess<'de> for EnumDeserializer<'a> {
473    type Error = SerdeJSON5Error;
474    type Variant = JSONValueDeserializer<'a>;
475
476    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), SerdeJSON5Error>
477    where
478        V: DeserializeSeed<'de>,
479    {
480        use serde::de::IntoDeserializer;
481        let val = seed.deserialize(self.variant.into_deserializer())?;
482        Ok((val, JSONValueDeserializer { input: self.content }))
483    }
484}
485
486impl<'de, 'a> VariantAccess<'de> for JSONValueDeserializer<'a> {
487    type Error = SerdeJSON5Error;
488
489    fn unit_variant(self) -> Result<(), Self::Error> {
490        // If the variant is expected to have no value, do nothing:
491        Ok(())
492    }
493
494    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
495    where
496        T: de::DeserializeSeed<'de>,
497    {
498        // If the variant is a "newtype" (e.g. `MyEnum::Variant(SomeData)`),
499        // call deserialize on *this* deserializer to parse it.
500        seed.deserialize(self)
501    }
502
503    fn tuple_variant<V>(
504        self,
505        _len: usize,
506        visitor: V,
507    ) -> Result<V::Value, Self::Error>
508    where
509        V: Visitor<'de>,
510    {
511        // If the variant is a tuple, we can delegate to `deserialize_seq`.
512        self.deserialize_seq(visitor)
513    }
514
515    fn struct_variant<V>(
516        self,
517        _fields: &'static [&'static str],
518        visitor: V,
519    ) -> Result<V::Value, Self::Error>
520    where
521        V: Visitor<'de>,
522    {
523        // If the variant is a struct, we can delegate to `deserialize_map`.
524        self.deserialize_map(visitor)
525    }
526}
527
528/// Deserialize str to your values/structs/etc. compatible with the serde data model
529///
530///
531/// # Examples
532///
533/// ```rust
534/// use json_five::from_str;
535/// use serde::Deserialize;
536/// #[derive(Debug, PartialEq, Deserialize)]
537/// struct MyData {
538///     name: String,
539///     count: i64,
540///     maybe: Option<f64>,
541/// }
542///
543/// fn main() {
544///     let source = r#"
545///     // A possible JSON5 input
546///     {
547///       name: 'Hello',
548///       count: 42,
549///       maybe: null
550///     }
551/// "#;
552///
553///     let parsed = from_str::<MyData>(source).unwrap();
554///     let expected = MyData {name: "Hello".to_string(), count: 42, maybe: None};
555///     assert_eq!(parsed, expected);
556/// }
557/// ```
558///
559/// For convenience in dealing with arbitrary valid JSON5 documents, you may use `serde_json`'s [`Value` enum](https://docs.rs/serde_json/latest/serde_json/enum.Value.html).
560/// with this crate. This may be something implemented or vendored into `json-five` in the future.
561///
562pub fn from_str<'de, T>(s: &'de str) -> Result<T, SerdeJSON5Error>
563where
564    T: Deserialize<'de>,
565{
566    // 1) Parse the string into your JSONText
567    let parsed = model_from_str(s).map_err(|err| SerdeJSON5Error::Custom(err.to_string()))?;
568
569    // 2) Wrap the JSONValue in our deserializer
570    let deserializer = JSONValueDeserializer {
571        input: &parsed.value,
572    };
573
574    // 3) Deserialize into the caller’s type T
575    T::deserialize(deserializer)
576}
577
578#[cfg(test)]
579mod test {
580    use std::collections::HashMap;
581    use serde::Deserialize;
582    use super::*;
583    #[derive(Debug, Deserialize)]
584    struct MyData {
585        name: String,
586        count: i64,
587        maybe: Option<f64>,
588    }
589    #[test]
590    fn main() {
591        let source = r#"
592        // A possible JSON5 input
593        {
594          name: 'Hello',
595          count: 42,
596          maybe: NaN
597        }
598    "#;
599
600        match from_str::<MyData>(source) {
601            Ok(data) => {
602                println!("Parsed data: {:?}", data);
603                println!("{}{}{:?}", data.name, data.count, data.maybe)
604            }
605            Err(e) => {
606                println!("Error: {:?}", e);
607            }
608        }
609    }
610
611    #[test]
612    fn test_hashmap() {
613        let source = r#"
614        // A possible JSON5 input
615        {
616          name: 'Hello',
617          count: '42',
618          maybe: null
619        }
620    "#;
621
622        let res: HashMap<String, Option<String>> = from_str(source).unwrap();
623        let expected = HashMap::from([
624            (String::from("name"), Some(String::from("Hello"))),
625            (String::from("count"), Some(String::from("42"))),
626            (String::from("maybe"), None),
627        ]);
628        assert_eq!(res, expected)
629
630    }
631
632
633}
634
635#[cfg(test)]
636mod json5_compat_tests {
637    use super::*; // Bring in your `from_str` parser.
638    use std::collections::BTreeMap; // Or HashMap, if preferred.
639    use serde::Deserialize;
640
641    /// A minimal JSON5-like "value" type for testing.
642    /// Adjust as needed for your parser’s feature set.
643    #[derive(Debug, PartialEq, Deserialize)]
644    #[serde(untagged)]
645    enum MyValue {
646        Null,
647        Bool(bool),
648        Number(f64),
649        String(String),
650        Array(Vec<MyValue>),
651        Object(BTreeMap<String, MyValue>),
652    }
653
654    /// Helper to parse a string with your JSON5 parser under test.
655    fn parse_test(input: &str) -> MyValue {
656        match from_str::<MyValue>(input) {
657            Ok(v) => v,
658            Err(e) => panic!("Error parsing input: {:?}", e),
659        }
660    }
661
662    // ------------------------------------------------------------------------
663    // Objects
664    // ------------------------------------------------------------------------
665
666    #[test]
667    fn object_empty() {
668        let v = parse_test(r#"{}"#);
669        match v {
670            MyValue::Object(map) => assert!(map.is_empty()),
671            _ => panic!("Expected an empty object"),
672        }
673    }
674
675    #[test]
676    fn object_double_quoted_key() {
677        let v = parse_test(r#"{"a":1}"#);
678        match v {
679            MyValue::Object(map) => {
680                assert_eq!(map.get("a"), Some(&MyValue::Number(1.0)));
681            }
682            _ => panic!("Expected an object with key 'a' = 1"),
683        }
684    }
685
686    #[test]
687    fn object_single_quoted_key() {
688        let v = parse_test(r#"{'a':1}"#);
689        match v {
690            MyValue::Object(map) => {
691                assert_eq!(map.get("a"), Some(&MyValue::Number(1.0)));
692            }
693            _ => panic!("Expected an object with key 'a' = 1"),
694        }
695    }
696
697    #[test]
698    fn object_unquoted_key() {
699        let v = parse_test(r#"{a:1}"#);
700        match v {
701            MyValue::Object(map) => {
702                assert_eq!(map.get("a"), Some(&MyValue::Number(1.0)));
703            }
704            _ => panic!("Expected an object with key 'a' = 1"),
705        }
706    }
707
708    #[test]
709    fn object_special_keys() {
710        let v = parse_test(r#"{$_:1,_$:2,a\u200C:3}"#);
711        dbg!(&v);
712        match v {
713            MyValue::Object(map) => {
714                assert_eq!(map.get("$_"), Some(&MyValue::Number(1.0)));
715                assert_eq!(map.get("_$"), Some(&MyValue::Number(2.0)));
716                assert_eq!(map.get("a\u{200C}"), Some(&MyValue::Number(3.0)));
717            }
718            _ => panic!("Expected an object with special keys $_, _$, and a\u{200C}"),
719        }
720    }
721
722    #[test]
723    fn object_unicode_key() {
724        let v = parse_test(r#"{ùńîċõďë:9}"#);
725        match v {
726            MyValue::Object(map) => {
727                assert_eq!(map.get("ùńîċõďë"), Some(&MyValue::Number(9.0)));
728            }
729            _ => panic!("Expected an object with unicode key 'ùńîċõďë' = 9"),
730        }
731    }
732
733
734    #[test]
735    fn object_unicode_key_quoted() {
736        let v = parse_test(r#"{"ùńîċõďë":9}"#);
737        match v {
738            MyValue::Object(map) => {
739                assert_eq!(map.get("ùńîċõďë"), Some(&MyValue::Number(9.0)));
740            }
741            _ => panic!("Expected an object with unicode key 'ùńîċõďë' = 9"),
742        }
743    }
744
745    #[test]
746    fn object_escaped_keys() {
747        let v = parse_test(r#"{\u0061\u0062:1,\u0024\u005F:2,\u005F\u0024:3}"#);
748        dbg!(&v);
749        match v {
750            MyValue::Object(map) => {
751                // \u0061\u0062 -> "ab"
752                assert_eq!(map.get("ab"), Some(&MyValue::Number(1.0)));
753                // \u0024\u005F -> "$_"
754                assert_eq!(map.get("$_"), Some(&MyValue::Number(2.0)));
755                // \u005F\u0024 -> "_$"
756                assert_eq!(map.get("_$"), Some(&MyValue::Number(3.0)));
757            }
758            _ => panic!("Expected escaped keys"),
759        }
760    }
761
762    #[test]
763    fn object_proto_name() {
764        let v = parse_test(r#"{"__proto__":1}"#);
765        match v {
766            MyValue::Object(map) => {
767                // In Rust, it's just a normal key:
768                assert_eq!(map.get("__proto__"), Some(&MyValue::Number(1.0)));
769            }
770            _ => panic!("Expected object with '__proto__' key"),
771        }
772    }
773
774    #[test]
775    fn object_multiple_properties() {
776        let v = parse_test(r#"{abc:1,def:2}"#);
777        match v {
778            MyValue::Object(map) => {
779                assert_eq!(map.get("abc"), Some(&MyValue::Number(1.0)));
780                assert_eq!(map.get("def"), Some(&MyValue::Number(2.0)));
781            }
782            _ => panic!("Expected object with {{abc:1,def:2}}"),
783        }
784    }
785
786    #[test]
787    fn object_nested() {
788        let v = parse_test(r#"{a:{b:2}}"#);
789        match v {
790            MyValue::Object(outer) => {
791                match outer.get("a") {
792                    Some(MyValue::Object(inner)) => {
793                        assert_eq!(inner.get("b"), Some(&MyValue::Number(2.0)));
794                    }
795                    _ => panic!("Expected a nested object {{b:2}}"),
796                }
797            }
798            _ => panic!("Expected object with key 'a'"),
799        }
800    }
801
802    // ------------------------------------------------------------------------
803    // Arrays
804    // ------------------------------------------------------------------------
805
806    #[test]
807    fn array_empty() {
808        let v = parse_test(r#"[]"#);
809        match v {
810            MyValue::Array(arr) => {
811                assert!(arr.is_empty());
812            }
813            _ => panic!("Expected an empty array"),
814        }
815    }
816
817    #[test]
818    fn array_single_value() {
819        let v = parse_test(r#"[1]"#);
820        match v {
821            MyValue::Array(arr) => {
822                assert_eq!(arr.len(), 1);
823                assert_eq!(arr[0], MyValue::Number(1.0));
824            }
825            _ => panic!("Expected [1]"),
826        }
827    }
828
829    #[test]
830    fn array_multiple_values() {
831        let v = parse_test(r#"[1,2]"#);
832        match v {
833            MyValue::Array(arr) => {
834                assert_eq!(arr, vec![MyValue::Number(1.0), MyValue::Number(2.0)]);
835            }
836            _ => panic!("Expected [1,2]"),
837        }
838    }
839
840    #[test]
841    fn array_nested() {
842        let v = parse_test(r#"[1,[2,3]]"#);
843        match v {
844            MyValue::Array(arr) => {
845                assert_eq!(arr.len(), 2);
846                assert_eq!(arr[0], MyValue::Number(1.0));
847                match &arr[1] {
848                    MyValue::Array(inner) => {
849                        assert_eq!(inner, &vec![MyValue::Number(2.0), MyValue::Number(3.0)]);
850                    }
851                    _ => panic!("Expected a nested array [2,3]"),
852                }
853            }
854            _ => panic!("Expected an array with nested array"),
855        }
856    }
857
858
859    #[test]
860    fn parse_null() {
861        let v = parse_test(r#"null"#);
862        assert_eq!(v, MyValue::Null);
863    }
864
865    #[test]
866    fn parse_true() {
867        let v = parse_test(r#"true"#);
868        assert_eq!(v, MyValue::Bool(true));
869    }
870
871    #[test]
872    fn parse_false() {
873        let v = parse_test(r#"false"#);
874        assert_eq!(v, MyValue::Bool(false));
875    }
876
877
878    #[test]
879    fn numbers_leading_zeroes() {
880        let v = parse_test(r#"[0,0.,0e0,]"#);
881        match v {
882            MyValue::Array(arr) => {
883                // All are 0.
884                assert_eq!(arr, vec![
885                    MyValue::Number(0.0),
886                    MyValue::Number(0.0),
887                    MyValue::Number(0.0),
888                ]);
889            }
890            _ => panic!("Expected array of zeros"),
891        }
892    }
893
894    #[test]
895    fn numbers_trailing_zeroes() {
896        let v = parse_test(r#"[.0]"#);
897        match v {
898            MyValue::Array(arr) => {
899                // All are 0.
900                assert_eq!(arr, vec![
901                    MyValue::Number(0.0),
902                ]);
903            }
904            _ => panic!("Expected array of zeros"),
905        }
906    }
907    #[test]
908    fn numbers_integers() {
909        let v = parse_test(r#"[1,23,456,7890]"#);
910        match v {
911            MyValue::Array(arr) => {
912                assert_eq!(arr, vec![
913                    MyValue::Number(1.0),
914                    MyValue::Number(23.0),
915                    MyValue::Number(456.0),
916                    MyValue::Number(7890.0),
917                ]);
918            }
919            _ => panic!("Expected integer array"),
920        }
921    }
922
923    #[test]
924    fn numbers_signed() {
925        let v = parse_test(r#"[-1,+2,-.1,-0]"#);
926        match v {
927            MyValue::Array(arr) => {
928                // Some tricky floating-point checks:
929                assert_eq!(arr[0], MyValue::Number(-1.0));
930                assert_eq!(arr[1], MyValue::Number(2.0));
931                assert_eq!(arr[2], MyValue::Number(-0.1));
932                // -0 is 0.0 in float equality:
933                let minus_zero = match arr[3] {
934                    MyValue::Number(f) => f,
935                    _ => panic!("Expected a number for -0"),
936                };
937                assert_eq!(minus_zero, 0.0);
938            }
939            _ => panic!("Expected array of signed numbers"),
940        }
941    }
942
943    #[test]
944    fn numbers_leading_decimal() {
945        let v = parse_test(r#"[.1,.23]"#);
946        match v {
947            MyValue::Array(arr) => {
948                assert_eq!(arr, vec![MyValue::Number(0.1), MyValue::Number(0.23)]);
949            }
950            _ => panic!("Expected array of leading-decimal numbers"),
951        }
952    }
953
954    #[test]
955    fn numbers_fractional() {
956        let v = parse_test(r#"[1.0,1.23]"#);
957        match v {
958            MyValue::Array(arr) => {
959                assert_eq!(arr, vec![MyValue::Number(1.0), MyValue::Number(1.23)]);
960            }
961            _ => panic!("Expected array with fractional numbers"),
962        }
963    }
964
965    #[test]
966    fn numbers_exponents() {
967        let v = parse_test(r#"[1e0,1e1,1e01,1.e0,1.1e0,1e-1,1e+1]"#);
968        match v {
969            MyValue::Array(arr) => {
970                let expected = vec![
971                    MyValue::Number(1.0),
972                    MyValue::Number(10.0),
973                    MyValue::Number(10.0),
974                    MyValue::Number(1.0),
975                    MyValue::Number(1.1),
976                    MyValue::Number(0.1),
977                    MyValue::Number(10.0),
978                ];
979                assert_eq!(arr, expected);
980            }
981            _ => panic!("Expected array of exponent numbers"),
982        }
983    }
984
985    #[test]
986    fn numbers_hexadecimal() {
987        let v = parse_test(r#"[0x1,0x10,0xff,0xFF]"#);
988        match v {
989            MyValue::Array(arr) => {
990                let expected = vec![
991                    MyValue::Number(1.0),
992                    MyValue::Number(16.0),
993                    MyValue::Number(255.0),
994                    MyValue::Number(255.0),
995                ];
996                assert_eq!(arr, expected);
997            }
998            _ => panic!("Expected array of hex numbers"),
999        }
1000    }
1001
1002    #[test]
1003    fn numbers_infinity() {
1004        let v = parse_test(r#"[Infinity,-Infinity]"#);
1005        match v {
1006            MyValue::Array(arr) => {
1007                match arr.as_slice() {
1008                    [MyValue::Number(a), MyValue::Number(b)] => {
1009                        assert!(a.is_infinite() && a.is_sign_positive());
1010                        assert!(b.is_infinite() && b.is_sign_negative());
1011                    }
1012                    _ => panic!("Expected [Infinity, -Infinity]"),
1013                }
1014            }
1015            _ => panic!("Expected array"),
1016        }
1017    }
1018
1019    #[test]
1020    fn numbers_nan() {
1021        let v = parse_test(r#"NaN"#);
1022        match v {
1023            MyValue::Number(f) => assert!(f.is_nan()),
1024            _ => panic!("Expected NaN"),
1025        }
1026    }
1027
1028    #[test]
1029    fn numbers_negative_nan() {
1030        let v = parse_test(r#"-NaN"#);
1031        match v {
1032            MyValue::Number(f) => assert!(f.is_nan()),
1033            _ => panic!("Expected -NaN"),
1034        }
1035    }
1036
1037    #[test]
1038    fn numbers_single() {
1039        let v = parse_test(r#"1"#);
1040        assert_eq!(v, MyValue::Number(1.0));
1041    }
1042
1043    #[test]
1044    fn numbers_signed_explicit() {
1045        let v = parse_test(r#"+1.23e100"#);
1046        match v {
1047            MyValue::Number(f) => {
1048                assert_eq!(f, 1.23e100);
1049            }
1050            _ => panic!("Expected +1.23e100 as a number"),
1051        }
1052    }
1053
1054    #[test]
1055    fn numbers_bare_hex() {
1056        let v = parse_test(r#"0x1"#);
1057        assert_eq!(v, MyValue::Number(1.0));
1058    }
1059
1060    #[test]
1061    #[should_panic]
1062    fn numbers_bare_long_hex() {
1063        let v = parse_test(r#"-0x0123456789abcdefABCDEF"#);
1064        match v {
1065            MyValue::Number(f) => {
1066                // Very large; f might be approximate in float form. We just check it's a number.
1067                assert!(f.is_sign_negative());
1068            }
1069            _ => panic!("Expected a negative large hex as a float number"),
1070        }
1071    }
1072
1073
1074    #[test]
1075    fn strings_double_quoted() {
1076        let v = parse_test(r#""abc""#);
1077        assert_eq!(v, MyValue::String("abc".to_owned()));
1078    }
1079
1080    #[test]
1081    fn strings_single_quoted() {
1082        let v = parse_test(r#"'abc'"#);
1083        assert_eq!(v, MyValue::String("abc".to_owned()));
1084    }
1085
1086    #[test]
1087    fn strings_quotes_in_strings() {
1088        let v = parse_test(r#"['"',"'"]"#);
1089        match v {
1090            MyValue::Array(arr) => {
1091                assert_eq!(arr, vec![
1092                    MyValue::String("\"".to_owned()),
1093                    MyValue::String("'".to_owned()),
1094                ]);
1095            }
1096            _ => panic!("Expected an array with double-quote and single-quote strings"),
1097        }
1098    }
1099
1100    #[test]
1101    fn strings_escaped_chars() {
1102        // The JavaScript test includes many escapes plus line continuations.
1103        let input = "'\\a\\b\\f\\n\\r\\t\\v\\0\\x0f\\u01fF\\\n\\\r\n\\\r\\\u{2028}\\\u{2029}\\'\\\"'";
1104        println!("{:?}", input);
1105        let v = parse_test(input);
1106        let expected = String::from("\x07\x08\x0C\n\r\t\x0B\0\x0f\u{01fF}\n\r\n\r\u{2028}\u{2029}'\"");
1107        match v {
1108            MyValue::String(s) => {
1109                assert_eq!(s, expected)
1110            }
1111            _ => panic!("Expected an escaped string"),
1112        }
1113    }
1114
1115    #[test]
1116    fn strings_line_paragraph_separators() {
1117        let v = parse_test(r#"'\u2028\u2029'"#);
1118        match v {
1119            MyValue::String(s) => {
1120                assert_eq!(s, "\u{2028}\u{2029}");
1121            }
1122            _ => panic!("Expected string with line/paragraph separators"),
1123        }
1124    }
1125
1126
1127    #[test]
1128    fn comments_single_line() {
1129        let input = r#"{// comment
1130        }"#;
1131        let v = parse_test(input);
1132        match v {
1133            MyValue::Object(map) => assert!(map.is_empty()),
1134            _ => panic!("Expected empty object"),
1135        }
1136    }
1137
1138    #[test]
1139    fn comments_single_line_at_end() {
1140        let input = r#"{}// comment"#;
1141        let v = parse_test(input);
1142        match v {
1143            MyValue::Object(map) => assert!(map.is_empty()),
1144            _ => panic!("Expected empty object"),
1145        }
1146    }
1147
1148    #[test]
1149    fn comments_multi_line() {
1150        let input = r#"{/* comment
1151        ** */}"#;
1152        let v = parse_test(input);
1153        match v {
1154            MyValue::Object(map) => assert!(map.is_empty()),
1155            _ => panic!("Expected empty object"),
1156        }
1157    }
1158
1159    #[test]
1160    fn whitespace() {
1161        // Includes tabs, vertical tabs, form feeds, non-breaking spaces, etc.
1162        let input = "{\t\u{000B}\u{000C} \u{00A0}\u{FEFF}\n\r\u{2028}\u{2029}\u{2003}}";
1163        let v = parse_test(input);
1164        match v {
1165            MyValue::Object(map) => assert!(map.is_empty()),
1166            _ => panic!("Expected empty object after whitespace"),
1167        }
1168    }
1169}