1use serde::de::{self, DeserializeSeed, Deserialize, Deserializer, MapAccess, SeqAccess, VariantAccess, Visitor};
2use std::fmt;
3use std::ops::Neg;
4use crate::parser::{JSONValue, JSONKeyValuePair, UnaryOperator, from_str as model_from_str, from_bytes as model_from_bytes};
5use crate::utils::unescape;
6#[derive(Debug)]
7pub enum SerdeJSON5Error {
8 Custom(String),
9}
10
11impl fmt::Display for SerdeJSON5Error {
12 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13 match self {
14 SerdeJSON5Error::Custom(msg) => write!(f, "{}", msg),
15 }
16 }
17}
18
19impl std::error::Error for SerdeJSON5Error {}
20
21impl de::Error for SerdeJSON5Error {
22 fn custom<T: fmt::Display>(msg: T) -> Self {
23 SerdeJSON5Error::Custom(msg.to_string())
24 }
25}
26
27pub struct JSONValueDeserializer<'a> {
30 input: &'a JSONValue<'a>,
31}
32
33
34
35impl<'de, 'a> Deserializer<'de> for JSONValueDeserializer<'a> {
36 type Error = SerdeJSON5Error;
37
38 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
39 where
40 V: Visitor<'de>,
41 {
42 match self.input {
43 JSONValue::Null => visitor.visit_unit(),
44 JSONValue::Bool(b) => visitor.visit_bool(*b),
45 JSONValue::DoubleQuotedString(s) | JSONValue::SingleQuotedString(s) => {
46 visitor.visit_str(unescape(s).unwrap().as_str())
47 }
48 JSONValue::Identifier(s) => visitor.visit_str(unescape(s).unwrap().as_str()),
49 JSONValue::JSONObject { key_value_pairs } => {
50 let mut map_deserializer = JSONMapAccess {
52 pairs: key_value_pairs,
53 index: 0,
54 };
55 visitor.visit_map(&mut map_deserializer)
56 }
57 JSONValue::JSONArray { values } => {
58 let mut seq_deserializer = JSONSeqAccess {
59 values,
60 index: 0,
61 };
62 visitor.visit_seq(&mut seq_deserializer)
63 }
64 JSONValue::Integer(s) => {
65 if let Ok(i) = s.parse::<i64>() {
67 visitor.visit_i64(i)
68 } else {
69 if let Ok(u) = s.parse::<u64>() {
71 visitor.visit_u64(u)
72 } else {
73 Err(de::Error::custom(format!("Invalid integer literal: {}", s)))
75 }
76 }
77 }
78 JSONValue::Float(s) | JSONValue::Exponent(s) => {
79 if let Ok(f) = s.parse::<f64>() {
81 visitor.visit_f64(f)
82 } else {
83 Err(de::Error::custom(format!("Invalid float {}", s)))
84 }
85 }
86 JSONValue::Infinity => visitor.visit_f64(f64::INFINITY),
87 JSONValue::NaN => visitor.visit_f64(f64::NAN),
88 JSONValue::Hexadecimal(s) => {
89 match u64::from_str_radix(s.to_lowercase().trim_start_matches("0x"), 16) {
91 Ok(hex) => {
92 visitor.visit_u64(hex)
93 }
94 Err(e) => {
95 Err(de::Error::custom(format!("Invalid hex {}", e)))
96 }
97 }
98 }
99 JSONValue::Unary { operator, value } => {
100 match &**value {
101 JSONValue::Integer(s) => {
102 if let Ok(i) = s.parse::<i64>() {
103 match operator {
104 UnaryOperator::Plus => {visitor.visit_i64(i)}
105 UnaryOperator::Minus => {visitor.visit_i64(i.neg())}
106 }
107 } else {
108 match operator {
109 UnaryOperator::Plus => {
110 let x = s.parse::<u64>().map_err(de::Error::custom)?;
111 visitor.visit_u64(x)
112 }
113 _ => {
114 Err(de::Error::custom(format!("Invalid integer literal for unary: {:?}", s)))
115
116 }
117 }
118 }
119 }
120 JSONValue::Float(s) | JSONValue::Exponent(s) => {
121 if let Ok(f) = s.parse::<f64>() {
122 match operator {
123 UnaryOperator::Plus => {visitor.visit_f64(f)}
124 UnaryOperator::Minus => {visitor.visit_f64(f.neg())}
125 }
126 } else {
127 Err(de::Error::custom(format!("Invalid float literal: {:?}", s)))
128 }
129 }
130 JSONValue::Infinity => {
131 match operator {
132 UnaryOperator::Plus => {visitor.visit_f64(f64::INFINITY)}
133 UnaryOperator::Minus => {visitor.visit_f64(f64::NEG_INFINITY)}
134 }
135 }
136 JSONValue::NaN => {
137 match operator {
138 UnaryOperator::Plus => {visitor.visit_f64(f64::NAN)}
139 UnaryOperator::Minus => {visitor.visit_f64(f64::NAN.neg())}
140 }
141 }
142 JSONValue::Hexadecimal(s) => {
143 match u64::from_str_radix(s.to_lowercase().trim_start_matches("0x"), 16) {
144 Ok(hex) => {
145 match operator {
146 UnaryOperator::Plus => {
147 visitor.visit_u64(hex)
148 }
149 UnaryOperator::Minus => {
150 if hex > i64::MAX as u64 {
151 return Err(de::Error::custom(format!("Overflow when converting {} to i64", s)))
152 }
153 let i = hex as i64;
154 visitor.visit_i64(i)
155 }
156 }
157 }
158 Err(e) => {
159 Err(de::Error::custom(format!("Invalid hex {}", e)))
160 }
161 }
162 }
163 invalid_unary_val => {
164 Err(de::Error::custom(format!("Invalid unary value: {:?}", invalid_unary_val)))
165 }
166 }
167 }
168 }
169 }
170
171 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
175 where
176 V: Visitor<'de>,
177 {
178 self.deserialize_any(visitor)
179 }
180
181 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
182 where
183 V: Visitor<'de>
184 {
185 self.deserialize_i64(visitor)
186 }
187
188 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
189 where
190 V: Visitor<'de>
191 {
192 self.deserialize_i64(visitor)
193 }
194
195 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
196 where
197 V: Visitor<'de>
198 {
199 self.deserialize_i64(visitor)
200 }
201
202 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
203 where
204 V: Visitor<'de>,
205 {
206 match self.input {
208 JSONValue::Integer(s) => {
209 let i = s.parse::<i64>().map_err(de::Error::custom)?;
210 visitor.visit_i64(i)
211 }
212 JSONValue::Hexadecimal(s) => {
213 match u64::from_str_radix(s.to_lowercase().trim_start_matches("0x"), 16) {
214 Ok(hex) => {
215 if hex > i64::MAX as u64 {
216 return Err(de::Error::custom(format!("Overflow when converting {} to i64", s)))
217 }
218 let i = hex as i64;
219 visitor.visit_i64(i)
220 }
221 Err(e) => {
222 Err(de::Error::custom(format!("Invalid hex {}", e)))
223 }
224 }
225 }
226 JSONValue::Unary {operator, value} => {
227 match &**value {
228 JSONValue::Integer(s) => {
229 let i = s.parse::<i64>().map_err(de::Error::custom)?;
230 match operator {
231 UnaryOperator::Plus => {visitor.visit_i64(i)}
232 UnaryOperator::Minus => {visitor.visit_i64(-i)}
233 }
234 }
235 JSONValue::Hexadecimal(s) => {
236 match u64::from_str_radix(s.to_lowercase().trim_start_matches("0x"), 16) {
237 Ok(hex) => {
238 if hex > i64::MAX as u64 {
239 return Err(de::Error::custom(format!("Overflow when converting {} to i64", s)))
240 }
241 let i = hex as i64;
242 match operator {
243 UnaryOperator::Plus => {
244 visitor.visit_i64(i)
245 }
246 UnaryOperator::Minus => {
247 visitor.visit_i64(-i)
248 }
249 }
250 }
251 Err(e) => {
252 Err(de::Error::custom(format!("Invalid hex {}", e)))
253 }
254 }
255 }
256 val => {
257 Err(de::Error::custom(format!("Unsupported value for i64 {:?}", val)))
258 }
259 }
260 }
261 _ => self.deserialize_any(visitor),
262 }
263 }
264
265 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
266 where
267 V: Visitor<'de>
268 {
269 self.deserialize_u64(visitor)
270 }
271
272 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
273 where
274 V: Visitor<'de>
275 {
276 self.deserialize_u64(visitor)
277 }
278
279 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
280 where
281 V: Visitor<'de>
282 {
283 self.deserialize_u64(visitor)
284 }
285
286 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
287 where
288 V: Visitor<'de>
289 {
290 match self.input {
291 JSONValue::Integer(s) => {
292 let i = s.parse::<u64>().map_err(de::Error::custom)?;
293 visitor.visit_u64(i)
294 }
295 JSONValue::Hexadecimal(s) => {
296 match u64::from_str_radix(s.to_lowercase().trim_start_matches("0x"), 16) {
297 Ok(hex) => {
298 visitor.visit_u64(hex)
299 }
300 Err(e) => {
301 Err(de::Error::custom(format!("Invalid hex {}", e)))
302 }
303 }
304 }
305 JSONValue::Unary {operator, value} => {
306 match &**value {
307 JSONValue::Integer(s) => {
308 let i = s.parse::<u64>().map_err(de::Error::custom)?;
309 match operator {
310 UnaryOperator::Plus => {visitor.visit_u64(i)}
311 UnaryOperator::Minus => {
312 if i != 0 {
313 Err(de::Error::custom(format!("Invalid integer value: {:?}", s)))
314 } else {
315 visitor.visit_u64(0)
316 }
317 }
318 }
319 }
320 JSONValue::Hexadecimal(s) => {
321 match u64::from_str_radix(s.to_lowercase().trim_start_matches("0x"), 16) {
322 Ok(hex) => {
323 match operator {
324 UnaryOperator::Plus => {
325 visitor.visit_u64(hex)
326 }
327 UnaryOperator::Minus => {
328 if hex != 0 {
329 Err(de::Error::custom(format!("Invalid integer value: {:?}", s)))
330 } else {
331 visitor.visit_u64(0)
332 }
333
334 }
335 }
336 }
337 Err(e) => {
338 Err(de::Error::custom(format!("Invalid hex {}", e)))
339 }
340 }
341 }
342 val => {
343 Err(de::Error::custom(format!("Unsupported value for u64 {:?}", val)))
344 }
345 }
346 }
347 _ => self.deserialize_any(visitor),
348 }
349 }
350
351 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
352 where
353 V: Visitor<'de>
354 {
355 self.deserialize_f64(visitor)
356 }
357
358 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
359 where
360 V: Visitor<'de>,
361 {
362 match self.input {
363 JSONValue::Float(s) | JSONValue::Exponent(s) => {
364 let f = s.parse::<f64>().map_err(de::Error::custom)?;
365 visitor.visit_f64(f)
366 }
367 JSONValue::Infinity => visitor.visit_f64(f64::INFINITY),
368 JSONValue::NaN => visitor.visit_f64(f64::NAN),
369 _ => self.deserialize_any(visitor),
370 }
371 }
372
373 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
374 where
375 V: Visitor<'de>
376 {
377 self.deserialize_any(visitor)
378 }
379
380 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
381 where
382 V: Visitor<'de>
383 {
384 self.deserialize_any(visitor)
385 }
386
387 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
388 where
389 V: Visitor<'de>
390 {
391 self.deserialize_any(visitor)
392 }
393
394 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
395 where
396 V: Visitor<'de>
397 {
398 self.deserialize_any(visitor)
399 }
400
401 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
402 where
403 V: Visitor<'de>
404 {
405 self.deserialize_any(visitor)
406 }
407
408 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
410 where
411 V: Visitor<'de>,
412 {
413 match self.input {
414 JSONValue::Null => visitor.visit_none(),
415 _ => visitor.visit_some(self),
416 }
417 }
418
419 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
420 where
421 V: Visitor<'de>,
422 {
423 if let JSONValue::Null = self.input {
424 visitor.visit_unit()
425 } else {
426 self.deserialize_any(visitor)
427 }
428 }
429
430 fn deserialize_unit_struct<V>(
431 self,
432 _name: &'static str,
433 visitor: V,
434 ) -> Result<V::Value, Self::Error>
435 where
436 V: Visitor<'de>,
437 {
438 self.deserialize_unit(visitor)
439 }
440
441 fn deserialize_newtype_struct<V>(
442 self,
443 _name: &'static str,
444 visitor: V,
445 ) -> Result<V::Value, Self::Error>
446 where
447 V: Visitor<'de>,
448 {
449 visitor.visit_newtype_struct(self)
450 }
451
452 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
453 where
454 V: Visitor<'de>,
455 {
456 match self.input {
457 JSONValue::JSONArray { values } => {
458 let mut seq = JSONSeqAccess {
459 values,
460 index: 0,
461 };
462 visitor.visit_seq(&mut seq)
463 }
464 _ => self.deserialize_any(visitor),
465 }
466 }
467
468 fn deserialize_tuple<V>(
469 self,
470 _len: usize,
471 visitor: V,
472 ) -> Result<V::Value, Self::Error>
473 where
474 V: Visitor<'de>,
475 {
476 self.deserialize_seq(visitor)
477 }
478
479 fn deserialize_tuple_struct<V>(
480 self,
481 _name: &'static str,
482 _len: usize,
483 visitor: V,
484 ) -> Result<V::Value, Self::Error>
485 where
486 V: Visitor<'de>,
487 {
488 self.deserialize_seq(visitor)
489 }
490
491 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
492 where
493 V: Visitor<'de>,
494 {
495 match self.input {
496 JSONValue::JSONObject { key_value_pairs } => {
497 let mut map = JSONMapAccess {
498 pairs: key_value_pairs,
499 index: 0,
500 };
501 visitor.visit_map(&mut map)
502 }
503 _ => self.deserialize_any(visitor),
504 }
505 }
506
507 fn deserialize_struct<V>(
508 self,
509 _name: &'static str,
510 _fields: &'static [&'static str],
511 visitor: V,
512 ) -> Result<V::Value, Self::Error>
513 where
514 V: Visitor<'de>,
515 {
516 self.deserialize_map(visitor)
517 }
518
519 fn deserialize_enum<V>(
520 self,
521 _name: &'static str,
522 _variants: &'static [&'static str],
523 visitor: V,
524 ) -> Result<V::Value, Self::Error>
525 where
526 V: Visitor<'de>,
527 {
528 use serde::de::IntoDeserializer;
532 match self.input {
533 JSONValue::Identifier(ident) | JSONValue::SingleQuotedString(ident) | JSONValue::DoubleQuotedString(ident) => {
534 visitor.visit_enum(ident.into_deserializer())
536 }
537 JSONValue::JSONObject { key_value_pairs } if !key_value_pairs.is_empty() => {
538 let kv = &key_value_pairs[0];
541 match kv.key {
542 JSONValue::Identifier(variant) | JSONValue::SingleQuotedString(variant) | JSONValue::DoubleQuotedString(variant) => {
543 visitor.visit_enum(EnumDeserializer {variant, content: &kv.value})
544 }
545 _ => Err(de::Error::custom("Invalid enum representation"))
546 }
547 }
548 _ => Err(de::Error::custom("Unsupported enum representation")),
549 }
550 }
551
552 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
553 where
554 V: Visitor<'de>,
555 {
556 match self.input {
557 JSONValue::Identifier(s)
558 | JSONValue::DoubleQuotedString(s)
559 | JSONValue::SingleQuotedString(s) => visitor.visit_str(unescape(s).unwrap().as_str()),
560 _ => self.deserialize_any(visitor),
561 }
562 }
563
564 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
565 where
566 V: Visitor<'de>,
567 {
568 visitor.visit_unit()
569 }
570}
571
572struct JSONSeqAccess<'a> {
574 values: &'a [JSONValue<'a>],
575 index: usize,
576}
577
578impl<'de, 'a> SeqAccess<'de> for JSONSeqAccess<'a> {
579 type Error = SerdeJSON5Error;
580
581 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, SerdeJSON5Error>
582 where
583 T: DeserializeSeed<'de>,
584 {
585 if self.index < self.values.len() {
586 let deserializer = JSONValueDeserializer {
587 input: &self.values[self.index],
588 };
589 self.index += 1;
590 seed.deserialize(deserializer).map(Some)
591 } else {
592 Ok(None)
593 }
594 }
595}
596
597struct JSONMapAccess<'a> {
599 pairs: &'a [JSONKeyValuePair<'a>],
600 index: usize,
601}
602
603impl<'de, 'a> MapAccess<'de> for JSONMapAccess<'a> {
604 type Error = SerdeJSON5Error;
605
606 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, SerdeJSON5Error>
607 where
608 K: DeserializeSeed<'de>,
609 {
610 if self.index < self.pairs.len() {
611 let deserializer = JSONValueDeserializer {
612 input: &self.pairs[self.index].key,
613 };
614 seed.deserialize(deserializer).map(Some)
615 } else {
616 Ok(None)
617 }
618 }
619
620 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, SerdeJSON5Error>
621 where
622 V: DeserializeSeed<'de>,
623 {
624 let deserializer = JSONValueDeserializer {
625 input: &self.pairs[self.index].value,
626 };
627 self.index += 1;
628 seed.deserialize(deserializer)
629 }
630}
631
632struct EnumDeserializer<'a> {
634 variant: &'a str,
635 content: &'a JSONValue<'a>,
636}
637
638impl<'de, 'a> de::EnumAccess<'de> for EnumDeserializer<'a> {
639 type Error = SerdeJSON5Error;
640 type Variant = JSONValueDeserializer<'a>;
641
642 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), SerdeJSON5Error>
643 where
644 V: DeserializeSeed<'de>,
645 {
646 use serde::de::IntoDeserializer;
647 let val = seed.deserialize(self.variant.into_deserializer())?;
648 Ok((val, JSONValueDeserializer { input: self.content }))
649 }
650}
651
652impl<'de, 'a> VariantAccess<'de> for JSONValueDeserializer<'a> {
653 type Error = SerdeJSON5Error;
654
655 fn unit_variant(self) -> Result<(), Self::Error> {
656 match self.input {
658 JSONValue::Null => {Ok(())}
659 _ => {
660 Err(de::Error::custom("Unit variants must be null"))
661 }
662 }
663
664 }
665
666 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
667 where
668 T: de::DeserializeSeed<'de>,
669 {
670 seed.deserialize(self)
673 }
674
675 fn tuple_variant<V>(
676 self,
677 _len: usize,
678 visitor: V,
679 ) -> Result<V::Value, Self::Error>
680 where
681 V: Visitor<'de>,
682 {
683 self.deserialize_seq(visitor)
685 }
686
687 fn struct_variant<V>(
688 self,
689 _fields: &'static [&'static str],
690 visitor: V,
691 ) -> Result<V::Value, Self::Error>
692 where
693 V: Visitor<'de>,
694 {
695 self.deserialize_map(visitor)
697 }
698}
699
700pub fn from_str<'de, T>(s: &'de str) -> Result<T, SerdeJSON5Error>
735where
736 T: Deserialize<'de>,
737{
738 let parsed = model_from_str(s).map_err(|err| SerdeJSON5Error::Custom(err.to_string()))?;
740
741 let deserializer = JSONValueDeserializer {
743 input: &parsed.value,
744 };
745
746 T::deserialize(deserializer)
748}
749
750pub fn from_bytes<'de, T>(s: &'de [u8]) -> Result<T, SerdeJSON5Error>
751where
752 T: Deserialize<'de>,
753{
754 let parsed = model_from_bytes(s).map_err(|err| SerdeJSON5Error::Custom(err.to_string()))?;
756
757 let deserializer = JSONValueDeserializer {
759 input: &parsed.value,
760 };
761
762 T::deserialize(deserializer)
764}
765
766#[cfg(test)]
767mod test {
768 use std::collections::HashMap;
769 use serde::Deserialize;
770 use super::*;
771 #[derive(Debug, Deserialize)]
772 struct MyData {
773 name: String,
774 count: i64,
775 maybe: Option<f64>,
776 }
777 #[test]
778 fn main() {
779 let source = r#"
780 // A possible JSON5 input
781 {
782 name: 'Hello',
783 count: 42,
784 maybe: NaN
785 }
786 "#;
787
788 match from_str::<MyData>(source) {
789 Ok(data) => {
790 println!("Parsed data: {:?}", data);
791 println!("{}{}{:?}", data.name, data.count, data.maybe)
792 }
793 Err(e) => {
794 println!("Error: {:?}", e);
795 }
796 }
797 }
798
799 #[test]
800 fn test_hashmap() {
801 let source = r#"
802 // A possible JSON5 input
803 {
804 name: 'Hello',
805 count: '42',
806 maybe: null
807 }
808 "#;
809
810 let res: HashMap<String, Option<String>> = from_str(source).unwrap();
811 let expected = HashMap::from([
812 (String::from("name"), Some(String::from("Hello"))),
813 (String::from("count"), Some(String::from("42"))),
814 (String::from("maybe"), None),
815 ]);
816 assert_eq!(res, expected)
817
818 }
819
820
821}
822
823#[cfg(test)]
824mod json5_compat_tests {
825 use super::*; use std::collections::BTreeMap; use serde::{Deserialize, Serialize};
828
829 #[derive(Debug, PartialEq, Deserialize)]
832 #[serde(untagged)]
833 enum MyValue {
834 Null,
835 Bool(bool),
836 Number(f64),
837 String(String),
838 Array(Vec<MyValue>),
839 Object(BTreeMap<String, MyValue>),
840 }
841
842 fn parse_test(input: &str) -> MyValue {
844 match from_str::<MyValue>(input) {
845 Ok(v) => v,
846 Err(e) => panic!("Error parsing input: {:?}", e),
847 }
848 }
849
850 #[test]
855 fn object_empty() {
856 let v = parse_test(r#"{}"#);
857 match v {
858 MyValue::Object(map) => assert!(map.is_empty()),
859 _ => panic!("Expected an empty object"),
860 }
861 }
862
863 #[test]
864 fn object_double_quoted_key() {
865 let v = parse_test(r#"{"a":1}"#);
866 match v {
867 MyValue::Object(map) => {
868 assert_eq!(map.get("a"), Some(&MyValue::Number(1.0)));
869 }
870 _ => panic!("Expected an object with key 'a' = 1"),
871 }
872 }
873
874 #[test]
875 fn object_single_quoted_key() {
876 let v = parse_test(r#"{'a':1}"#);
877 match v {
878 MyValue::Object(map) => {
879 assert_eq!(map.get("a"), Some(&MyValue::Number(1.0)));
880 }
881 _ => panic!("Expected an object with key 'a' = 1"),
882 }
883 }
884
885 #[test]
886 fn object_unquoted_key() {
887 let v = parse_test(r#"{a:1}"#);
888 match v {
889 MyValue::Object(map) => {
890 assert_eq!(map.get("a"), Some(&MyValue::Number(1.0)));
891 }
892 _ => panic!("Expected an object with key 'a' = 1"),
893 }
894 }
895
896 #[test]
897 fn object_special_keys() {
898 let v = parse_test(r#"{$_:1,_$:2,a\u200C:3}"#);
899 dbg!(&v);
900 match v {
901 MyValue::Object(map) => {
902 assert_eq!(map.get("$_"), Some(&MyValue::Number(1.0)));
903 assert_eq!(map.get("_$"), Some(&MyValue::Number(2.0)));
904 assert_eq!(map.get("a\u{200C}"), Some(&MyValue::Number(3.0)));
905 }
906 _ => panic!("Expected an object with special keys $_, _$, and a\u{200C}"),
907 }
908 }
909
910 #[test]
911 fn object_unicode_key() {
912 let v = parse_test(r#"{ùńîċõďë:9}"#);
913 match v {
914 MyValue::Object(map) => {
915 assert_eq!(map.get("ùńîċõďë"), Some(&MyValue::Number(9.0)));
916 }
917 _ => panic!("Expected an object with unicode key 'ùńîċõďë' = 9"),
918 }
919 }
920
921
922 #[test]
923 fn object_unicode_key_quoted() {
924 let v = parse_test(r#"{"ùńîċõďë":9}"#);
925 match v {
926 MyValue::Object(map) => {
927 assert_eq!(map.get("ùńîċõďë"), Some(&MyValue::Number(9.0)));
928 }
929 _ => panic!("Expected an object with unicode key 'ùńîċõďë' = 9"),
930 }
931 }
932
933 #[test]
934 fn object_escaped_keys() {
935 let v = parse_test(r#"{\u0061\u0062:1,\u0024\u005F:2,\u005F\u0024:3}"#);
936 dbg!(&v);
937 match v {
938 MyValue::Object(map) => {
939 assert_eq!(map.get("ab"), Some(&MyValue::Number(1.0)));
941 assert_eq!(map.get("$_"), Some(&MyValue::Number(2.0)));
943 assert_eq!(map.get("_$"), Some(&MyValue::Number(3.0)));
945 }
946 _ => panic!("Expected escaped keys"),
947 }
948 }
949
950 #[test]
951 fn object_proto_name() {
952 let v = parse_test(r#"{"__proto__":1}"#);
953 match v {
954 MyValue::Object(map) => {
955 assert_eq!(map.get("__proto__"), Some(&MyValue::Number(1.0)));
957 }
958 _ => panic!("Expected object with '__proto__' key"),
959 }
960 }
961
962 #[test]
963 fn object_multiple_properties() {
964 let v = parse_test(r#"{abc:1,def:2}"#);
965 match v {
966 MyValue::Object(map) => {
967 assert_eq!(map.get("abc"), Some(&MyValue::Number(1.0)));
968 assert_eq!(map.get("def"), Some(&MyValue::Number(2.0)));
969 }
970 _ => panic!("Expected object with {{abc:1,def:2}}"),
971 }
972 }
973
974 #[test]
975 fn object_nested() {
976 let v = parse_test(r#"{a:{b:2}}"#);
977 match v {
978 MyValue::Object(outer) => {
979 match outer.get("a") {
980 Some(MyValue::Object(inner)) => {
981 assert_eq!(inner.get("b"), Some(&MyValue::Number(2.0)));
982 }
983 _ => panic!("Expected a nested object {{b:2}}"),
984 }
985 }
986 _ => panic!("Expected object with key 'a'"),
987 }
988 }
989
990 #[test]
995 fn array_empty() {
996 let v = parse_test(r#"[]"#);
997 match v {
998 MyValue::Array(arr) => {
999 assert!(arr.is_empty());
1000 }
1001 _ => panic!("Expected an empty array"),
1002 }
1003 }
1004
1005 #[test]
1006 fn array_single_value() {
1007 let v = parse_test(r#"[1]"#);
1008 match v {
1009 MyValue::Array(arr) => {
1010 assert_eq!(arr.len(), 1);
1011 assert_eq!(arr[0], MyValue::Number(1.0));
1012 }
1013 _ => panic!("Expected [1]"),
1014 }
1015 }
1016
1017 #[test]
1018 fn array_multiple_values() {
1019 let v = parse_test(r#"[1,2]"#);
1020 match v {
1021 MyValue::Array(arr) => {
1022 assert_eq!(arr, vec![MyValue::Number(1.0), MyValue::Number(2.0)]);
1023 }
1024 _ => panic!("Expected [1,2]"),
1025 }
1026 }
1027
1028 #[test]
1029 fn array_nested() {
1030 let v = parse_test(r#"[1,[2,3]]"#);
1031 match v {
1032 MyValue::Array(arr) => {
1033 assert_eq!(arr.len(), 2);
1034 assert_eq!(arr[0], MyValue::Number(1.0));
1035 match &arr[1] {
1036 MyValue::Array(inner) => {
1037 assert_eq!(inner, &vec![MyValue::Number(2.0), MyValue::Number(3.0)]);
1038 }
1039 _ => panic!("Expected a nested array [2,3]"),
1040 }
1041 }
1042 _ => panic!("Expected an array with nested array"),
1043 }
1044 }
1045
1046
1047 #[test]
1048 fn parse_null() {
1049 let v = parse_test(r#"null"#);
1050 assert_eq!(v, MyValue::Null);
1051 }
1052
1053 #[test]
1054 fn parse_true() {
1055 let v = parse_test(r#"true"#);
1056 assert_eq!(v, MyValue::Bool(true));
1057 }
1058
1059 #[test]
1060 fn parse_false() {
1061 let v = parse_test(r#"false"#);
1062 assert_eq!(v, MyValue::Bool(false));
1063 }
1064
1065
1066 #[test]
1067 fn numbers_leading_zeroes() {
1068 let v = parse_test(r#"[0,0.,0e0,]"#);
1069 match v {
1070 MyValue::Array(arr) => {
1071 assert_eq!(arr, vec![
1073 MyValue::Number(0.0),
1074 MyValue::Number(0.0),
1075 MyValue::Number(0.0),
1076 ]);
1077 }
1078 _ => panic!("Expected array of zeros"),
1079 }
1080 }
1081
1082 #[test]
1083 fn numbers_trailing_zeroes() {
1084 let v = parse_test(r#"[.0]"#);
1085 match v {
1086 MyValue::Array(arr) => {
1087 assert_eq!(arr, vec![
1089 MyValue::Number(0.0),
1090 ]);
1091 }
1092 _ => panic!("Expected array of zeros"),
1093 }
1094 }
1095 #[test]
1096 fn numbers_integers() {
1097 let v = parse_test(r#"[1,23,456,7890]"#);
1098 match v {
1099 MyValue::Array(arr) => {
1100 assert_eq!(arr, vec![
1101 MyValue::Number(1.0),
1102 MyValue::Number(23.0),
1103 MyValue::Number(456.0),
1104 MyValue::Number(7890.0),
1105 ]);
1106 }
1107 _ => panic!("Expected integer array"),
1108 }
1109 }
1110
1111 #[test]
1112 fn numbers_signed() {
1113 let v = parse_test(r#"[-1,+2,-.1,-0]"#);
1114 match v {
1115 MyValue::Array(arr) => {
1116 assert_eq!(arr[0], MyValue::Number(-1.0));
1118 assert_eq!(arr[1], MyValue::Number(2.0));
1119 assert_eq!(arr[2], MyValue::Number(-0.1));
1120 let minus_zero = match arr[3] {
1122 MyValue::Number(f) => f,
1123 _ => panic!("Expected a number for -0"),
1124 };
1125 assert_eq!(minus_zero, 0.0);
1126 }
1127 _ => panic!("Expected array of signed numbers"),
1128 }
1129 }
1130
1131 #[test]
1132 fn numbers_leading_decimal() {
1133 let v = parse_test(r#"[.1,.23]"#);
1134 match v {
1135 MyValue::Array(arr) => {
1136 assert_eq!(arr, vec![MyValue::Number(0.1), MyValue::Number(0.23)]);
1137 }
1138 _ => panic!("Expected array of leading-decimal numbers"),
1139 }
1140 }
1141
1142 #[test]
1143 fn numbers_fractional() {
1144 let v = parse_test(r#"[1.0,1.23]"#);
1145 match v {
1146 MyValue::Array(arr) => {
1147 assert_eq!(arr, vec![MyValue::Number(1.0), MyValue::Number(1.23)]);
1148 }
1149 _ => panic!("Expected array with fractional numbers"),
1150 }
1151 }
1152
1153 #[test]
1154 fn numbers_exponents() {
1155 let v = parse_test(r#"[1e0,1e1,1e01,1.e0,1.1e0,1e-1,1e+1]"#);
1156 match v {
1157 MyValue::Array(arr) => {
1158 let expected = vec![
1159 MyValue::Number(1.0),
1160 MyValue::Number(10.0),
1161 MyValue::Number(10.0),
1162 MyValue::Number(1.0),
1163 MyValue::Number(1.1),
1164 MyValue::Number(0.1),
1165 MyValue::Number(10.0),
1166 ];
1167 assert_eq!(arr, expected);
1168 }
1169 _ => panic!("Expected array of exponent numbers"),
1170 }
1171 }
1172
1173 #[test]
1174 fn numbers_hexadecimal() {
1175 let v = parse_test(r#"[0x1,0x10,0xff,0xFF]"#);
1176 match v {
1177 MyValue::Array(arr) => {
1178 let expected = vec![
1179 MyValue::Number(1.0),
1180 MyValue::Number(16.0),
1181 MyValue::Number(255.0),
1182 MyValue::Number(255.0),
1183 ];
1184 assert_eq!(arr, expected);
1185 }
1186 _ => panic!("Expected array of hex numbers"),
1187 }
1188 }
1189
1190 #[test]
1191 fn numbers_infinity() {
1192 let v = parse_test(r#"[Infinity,-Infinity]"#);
1193 match v {
1194 MyValue::Array(arr) => {
1195 match arr.as_slice() {
1196 [MyValue::Number(a), MyValue::Number(b)] => {
1197 assert!(a.is_infinite() && a.is_sign_positive());
1198 assert!(b.is_infinite() && b.is_sign_negative());
1199 }
1200 _ => panic!("Expected [Infinity, -Infinity]"),
1201 }
1202 }
1203 _ => panic!("Expected array"),
1204 }
1205 }
1206
1207 #[test]
1208 fn numbers_nan() {
1209 let v = parse_test(r#"NaN"#);
1210 match v {
1211 MyValue::Number(f) => assert!(f.is_nan()),
1212 _ => panic!("Expected NaN"),
1213 }
1214 }
1215
1216 #[test]
1217 fn numbers_negative_nan() {
1218 let v = parse_test(r#"-NaN"#);
1219 match v {
1220 MyValue::Number(f) => assert!(f.is_nan()),
1221 _ => panic!("Expected -NaN"),
1222 }
1223 }
1224
1225 #[test]
1226 fn numbers_single() {
1227 let v = parse_test(r#"1"#);
1228 assert_eq!(v, MyValue::Number(1.0));
1229 }
1230
1231 #[test]
1232 fn numbers_signed_explicit() {
1233 let v = parse_test(r#"+1.23e100"#);
1234 match v {
1235 MyValue::Number(f) => {
1236 assert_eq!(f, 1.23e100);
1237 }
1238 _ => panic!("Expected +1.23e100 as a number"),
1239 }
1240 }
1241
1242 #[test]
1243 fn numbers_bare_hex() {
1244 let v = parse_test(r#"0x1"#);
1245 assert_eq!(v, MyValue::Number(1.0));
1246 }
1247
1248 #[test]
1249 #[should_panic]
1250 fn numbers_bare_long_hex() {
1251 let v = parse_test(r#"-0x0123456789abcdefABCDEF"#);
1252 match v {
1253 MyValue::Number(f) => {
1254 assert!(f.is_sign_negative());
1256 }
1257 _ => panic!("Expected a negative large hex as a float number"),
1258 }
1259 }
1260
1261
1262 #[test]
1263 fn strings_double_quoted() {
1264 let v = parse_test(r#""abc""#);
1265 assert_eq!(v, MyValue::String("abc".to_owned()));
1266 }
1267
1268 #[test]
1269 fn strings_single_quoted() {
1270 let v = parse_test(r#"'abc'"#);
1271 assert_eq!(v, MyValue::String("abc".to_owned()));
1272 }
1273
1274 #[test]
1275 fn strings_quotes_in_strings() {
1276 let v = parse_test(r#"['"',"'"]"#);
1277 match v {
1278 MyValue::Array(arr) => {
1279 assert_eq!(arr, vec![
1280 MyValue::String("\"".to_owned()),
1281 MyValue::String("'".to_owned()),
1282 ]);
1283 }
1284 _ => panic!("Expected an array with double-quote and single-quote strings"),
1285 }
1286 }
1287
1288 #[test]
1289 fn strings_escaped_chars() {
1290 let input = "'\\a\\b\\f\\n\\r\\t\\v\\0\\x0f\\u01fF\\\n\\\r\n\\\r\\\u{2028}\\\u{2029}\\'\\\"'";
1292 println!("{:?}", input);
1293 let v = parse_test(input);
1294 let expected = String::from("\x07\x08\x0C\n\r\t\x0B\0\x0f\u{01fF}\n\r\n\r\u{2028}\u{2029}'\"");
1295 match v {
1296 MyValue::String(s) => {
1297 assert_eq!(s, expected)
1298 }
1299 _ => panic!("Expected an escaped string"),
1300 }
1301 }
1302
1303 #[test]
1304 fn strings_line_paragraph_separators() {
1305 let v = parse_test(r#"'\u2028\u2029'"#);
1306 match v {
1307 MyValue::String(s) => {
1308 assert_eq!(s, "\u{2028}\u{2029}");
1309 }
1310 _ => panic!("Expected string with line/paragraph separators"),
1311 }
1312 }
1313
1314
1315 #[test]
1316 fn comments_single_line() {
1317 let input = r#"{// comment
1318 }"#;
1319 let v = parse_test(input);
1320 match v {
1321 MyValue::Object(map) => assert!(map.is_empty()),
1322 _ => panic!("Expected empty object"),
1323 }
1324 }
1325
1326 #[test]
1327 fn comments_single_line_at_end() {
1328 let input = r#"{}// comment"#;
1329 let v = parse_test(input);
1330 match v {
1331 MyValue::Object(map) => assert!(map.is_empty()),
1332 _ => panic!("Expected empty object"),
1333 }
1334 }
1335
1336 #[test]
1337 fn comments_multi_line() {
1338 let input = r#"{/* comment
1339 ** */}"#;
1340 let v = parse_test(input);
1341 match v {
1342 MyValue::Object(map) => assert!(map.is_empty()),
1343 _ => panic!("Expected empty object"),
1344 }
1345 }
1346
1347 #[test]
1348 fn whitespace() {
1349 let input = "{\t\u{000B}\u{000C} \u{00A0}\u{FEFF}\n\r\u{2028}\u{2029}\u{2003}}";
1351 let v = parse_test(input);
1352 match v {
1353 MyValue::Object(map) => assert!(map.is_empty()),
1354 _ => panic!("Expected empty object after whitespace"),
1355 }
1356 }
1357
1358 #[test]
1359 fn test_gh_11() {
1360 use crate::from_str;
1361 #[derive(Debug, Clone, serde::Deserialize, Serialize, PartialEq)]
1362 #[serde(rename_all="snake_case")]
1363 enum SomeEnum{
1364 VariantA(String),
1365 VariantB,
1366 }
1367
1368 #[derive(Debug, Clone, serde::Deserialize, Serialize)]
1369 struct SomeStruct {
1370 some_enum: SomeEnum
1371 }
1372
1373
1374 let json5 = r#"{some_enum: "variant_b" }"#;
1375 let parsed: SomeStruct = from_str(json5).unwrap();
1376 assert_eq!(parsed.some_enum, SomeEnum::VariantB);
1377
1378 let json5 = r#"{some_enum: {"variant_b": null} }"#;
1379 let parsed: SomeStruct = from_str(json5).unwrap();
1380 assert_eq!(parsed.some_enum, SomeEnum::VariantB);
1381
1382
1383 let json5 = r#"{some_enum: { "variant_b": {} }}"#;
1384 let maybe_res: Result<SomeStruct, _> = from_str(json5);
1385 let err = maybe_res.unwrap_err();
1386 }
1387}