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
26pub 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 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 if let Ok(i) = s.parse::<i64>() {
66 visitor.visit_i64(i)
67 } else {
68 if let Ok(u) = s.parse::<u64>() {
70 visitor.visit_u64(u)
71 } else {
72 Err(de::Error::custom(format!("Invalid integer {}", s)))
74 }
75 }
76 }
77 JSONValue::Float(s) | JSONValue::Exponent(s) => {
78 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 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 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 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 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 use serde::de::IntoDeserializer;
364 match self.input {
365 JSONValue::Identifier(ident) => {
366 visitor.visit_enum(ident.into_deserializer())
368 }
369 JSONValue::JSONObject { key_value_pairs } if !key_value_pairs.is_empty() => {
370 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
406struct 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
431struct 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
466struct 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 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 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 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 self.deserialize_map(visitor)
525 }
526}
527
528pub fn from_str<'de, T>(s: &'de str) -> Result<T, SerdeJSON5Error>
563where
564 T: Deserialize<'de>,
565{
566 let parsed = model_from_str(s).map_err(|err| SerdeJSON5Error::Custom(err.to_string()))?;
568
569 let deserializer = JSONValueDeserializer {
571 input: &parsed.value,
572 };
573
574 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::*; use std::collections::BTreeMap; use serde::Deserialize;
640
641 #[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 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 #[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 assert_eq!(map.get("ab"), Some(&MyValue::Number(1.0)));
753 assert_eq!(map.get("$_"), Some(&MyValue::Number(2.0)));
755 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 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 #[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 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 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 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 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 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 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 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}