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