json_syntax/serde/
de.rs

1use serde::{
2	de::{
3		DeserializeSeed, EnumAccess, Expected, IntoDeserializer, MapAccess, SeqAccess, Unexpected,
4		VariantAccess, Visitor,
5	},
6	forward_to_deserialize_any, Deserialize,
7};
8use std::fmt;
9
10use crate::{
11	object::{Entry, Key},
12	Array, NumberBuf, Object, Value,
13};
14
15use super::NUMBER_TOKEN;
16
17impl Value {
18	#[cold]
19	fn invalid_type<E>(&self, exp: &dyn Expected) -> E
20	where
21		E: serde::de::Error,
22	{
23		serde::de::Error::invalid_type(self.unexpected(), exp)
24	}
25
26	#[cold]
27	fn unexpected(&self) -> Unexpected {
28		match self {
29			Self::Null => Unexpected::Unit,
30			Self::Boolean(b) => Unexpected::Bool(*b),
31			Self::Number(n) => match n.as_u64() {
32				Some(u) => Unexpected::Unsigned(u),
33				None => match n.as_i64() {
34					Some(i) => Unexpected::Signed(i),
35					None => Unexpected::Float(n.as_f64_lossy()),
36				},
37			},
38			Self::String(s) => Unexpected::Str(s),
39			Self::Array(_) => Unexpected::Seq,
40			Self::Object(_) => Unexpected::Map,
41		}
42	}
43}
44
45impl<'de> Deserialize<'de> for Value {
46	#[inline]
47	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48	where
49		D: serde::Deserializer<'de>,
50	{
51		struct ValueVisitor;
52
53		impl<'de> Visitor<'de> for ValueVisitor {
54			type Value = Value;
55
56			fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
57				formatter.write_str("any valid JSON value")
58			}
59
60			#[inline]
61			fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
62				Ok(Value::Boolean(value))
63			}
64
65			#[inline]
66			fn visit_i64<E>(self, value: i64) -> Result<Value, E> {
67				Ok(Value::Number(value.into()))
68			}
69
70			#[inline]
71			fn visit_u64<E>(self, value: u64) -> Result<Value, E> {
72				Ok(Value::Number(value.into()))
73			}
74
75			#[inline]
76			fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
77				Ok(NumberBuf::try_from(value).map_or(Value::Null, Value::Number))
78			}
79
80			#[inline]
81			fn visit_str<E>(self, value: &str) -> Result<Value, E>
82			where
83				E: serde::de::Error,
84			{
85				Ok(Value::String(value.into()))
86			}
87
88			#[inline]
89			fn visit_string<E>(self, value: String) -> Result<Value, E> {
90				Ok(Value::String(value.into()))
91			}
92
93			#[inline]
94			fn visit_none<E>(self) -> Result<Value, E> {
95				Ok(Value::Null)
96			}
97
98			#[inline]
99			fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
100			where
101				D: serde::Deserializer<'de>,
102			{
103				Deserialize::deserialize(deserializer)
104			}
105
106			#[inline]
107			fn visit_unit<E>(self) -> Result<Value, E> {
108				Ok(Value::Null)
109			}
110
111			#[inline]
112			fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
113			where
114				V: SeqAccess<'de>,
115			{
116				let mut vec = Vec::new();
117
118				while let Some(elem) = visitor.next_element()? {
119					vec.push(elem);
120				}
121
122				Ok(Value::Array(vec))
123			}
124
125			fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
126			where
127				V: MapAccess<'de>,
128			{
129				enum MapTag {
130					Number,
131					None(Key),
132				}
133
134				impl<'de> Deserialize<'de> for MapTag {
135					fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
136					where
137						D: serde::Deserializer<'de>,
138					{
139						struct Visitor;
140
141						impl<'de> serde::de::Visitor<'de> for Visitor {
142							type Value = MapTag;
143
144							fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
145								formatter.write_str("a string key")
146							}
147
148							fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
149							where
150								E: serde::de::Error,
151							{
152								if v == NUMBER_TOKEN {
153									Ok(MapTag::Number)
154								} else {
155									Ok(MapTag::None(v.into()))
156								}
157							}
158
159							fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
160							where
161								E: serde::de::Error,
162							{
163								if v == NUMBER_TOKEN {
164									Ok(MapTag::Number)
165								} else {
166									Ok(MapTag::None(v.into()))
167								}
168							}
169						}
170
171						deserializer.deserialize_string(Visitor)
172					}
173				}
174
175				match visitor.next_key()? {
176					Some(MapTag::Number) => {
177						let value: String = visitor.next_value()?;
178						NumberBuf::new(value.into_bytes().into())
179							.map(Value::Number)
180							.map_err(|json_number::InvalidNumber(bytes)| {
181								serde::de::Error::custom(json_number::InvalidNumber(
182									String::from_utf8(bytes.into_vec()).unwrap(),
183								))
184							})
185					}
186					Some(MapTag::None(key)) => {
187						let mut object = Object::new();
188
189						object.insert(key, visitor.next_value()?);
190						while let Some((key, value)) = visitor.next_entry()? {
191							object.insert(key, value);
192						}
193
194						Ok(Value::Object(object))
195					}
196					None => Ok(Value::Object(Object::new())),
197				}
198			}
199		}
200
201		deserializer.deserialize_any(ValueVisitor)
202	}
203}
204
205impl<'de> IntoDeserializer<'de, DeserializeError> for Value {
206	type Deserializer = Self;
207
208	fn into_deserializer(self) -> Self::Deserializer {
209		self
210	}
211}
212
213impl<'de> Deserialize<'de> for Object {
214	fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
215	where
216		D: serde::Deserializer<'de>,
217	{
218		struct Visitor;
219
220		impl<'de> serde::de::Visitor<'de> for Visitor {
221			type Value = Object;
222
223			fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
224				write!(formatter, "a JSON object")
225			}
226
227			fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
228			where
229				A: MapAccess<'de>,
230			{
231				let mut object = Object::new();
232
233				while let Some((key, value)) = map.next_entry()? {
234					object.insert(key, value);
235				}
236
237				Ok(object)
238			}
239		}
240
241		deserializer.deserialize_map(Visitor)
242	}
243}
244
245impl<'de> IntoDeserializer<'de, DeserializeError> for Object {
246	type Deserializer = Value;
247
248	fn into_deserializer(self) -> Self::Deserializer {
249		Value::Object(self)
250	}
251}
252
253#[derive(Debug, Clone)]
254pub enum DeserializeError {
255	Custom(String),
256	NonStringKey,
257}
258
259impl fmt::Display for DeserializeError {
260	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
261		match self {
262			Self::Custom(msg) => msg.fmt(f),
263			Self::NonStringKey => write!(f, "key must be a string"),
264		}
265	}
266}
267
268impl From<json_number::serde::Unexpected> for DeserializeError {
269	fn from(value: json_number::serde::Unexpected) -> Self {
270		Self::Custom(value.to_string())
271	}
272}
273
274impl std::error::Error for DeserializeError {}
275
276impl serde::de::Error for DeserializeError {
277	fn custom<T>(msg: T) -> Self
278	where
279		T: fmt::Display,
280	{
281		Self::Custom(msg.to_string())
282	}
283}
284
285macro_rules! deserialize_number {
286	($method:ident) => {
287		fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
288		where
289			V: serde::de::Visitor<'de>,
290		{
291			match self {
292				Value::Number(n) => Ok(n.deserialize_any(visitor)?),
293				_ => Err(self.invalid_type(&visitor)),
294			}
295		}
296	};
297}
298
299impl<'de> serde::Deserializer<'de> for Value {
300	type Error = DeserializeError;
301
302	#[inline]
303	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
304	where
305		V: serde::de::Visitor<'de>,
306	{
307		match self {
308			Self::Null => visitor.visit_unit(),
309			Self::Boolean(v) => visitor.visit_bool(v),
310			Self::Number(n) => Ok(n.deserialize_any(visitor)?),
311			Self::String(s) => visitor.visit_string(s.into_string()),
312			Self::Array(a) => visit_array(a, visitor),
313			Self::Object(o) => visit_object(o, visitor),
314		}
315	}
316
317	deserialize_number!(deserialize_i8);
318	deserialize_number!(deserialize_i16);
319	deserialize_number!(deserialize_i32);
320	deserialize_number!(deserialize_i64);
321	deserialize_number!(deserialize_i128);
322	deserialize_number!(deserialize_u8);
323	deserialize_number!(deserialize_u16);
324	deserialize_number!(deserialize_u32);
325	deserialize_number!(deserialize_u64);
326	deserialize_number!(deserialize_u128);
327	deserialize_number!(deserialize_f32);
328	deserialize_number!(deserialize_f64);
329
330	#[inline]
331	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
332	where
333		V: serde::de::Visitor<'de>,
334	{
335		match self {
336			Value::Null => visitor.visit_none(),
337			_ => visitor.visit_some(self),
338		}
339	}
340
341	#[inline]
342	fn deserialize_enum<V>(
343		self,
344		_name: &str,
345		_variants: &'static [&'static str],
346		visitor: V,
347	) -> Result<V::Value, Self::Error>
348	where
349		V: serde::de::Visitor<'de>,
350	{
351		let (variant, value) = match self {
352			Value::Object(value) => {
353				let mut iter = value.into_iter();
354				let Entry {
355					key: variant,
356					value,
357				} = match iter.next() {
358					Some(v) => v,
359					None => {
360						return Err(serde::de::Error::invalid_value(
361							Unexpected::Map,
362							&"map with a single key",
363						));
364					}
365				};
366				// enums are encoded in json as maps with a single key:value pair
367				if iter.next().is_some() {
368					return Err(serde::de::Error::invalid_value(
369						Unexpected::Map,
370						&"map with a single key",
371					));
372				}
373				(variant, Some(value))
374			}
375			Value::String(variant) => (variant, None),
376			other => {
377				return Err(serde::de::Error::invalid_type(
378					other.unexpected(),
379					&"string or map",
380				));
381			}
382		};
383
384		visitor.visit_enum(EnumDeserializer { variant, value })
385	}
386
387	#[inline]
388	fn deserialize_newtype_struct<V>(
389		self,
390		_name: &'static str,
391		visitor: V,
392	) -> Result<V::Value, Self::Error>
393	where
394		V: serde::de::Visitor<'de>,
395	{
396		visitor.visit_newtype_struct(self)
397	}
398
399	fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
400	where
401		V: serde::de::Visitor<'de>,
402	{
403		match self {
404			Value::Boolean(v) => visitor.visit_bool(v),
405			_ => Err(self.invalid_type(&visitor)),
406		}
407	}
408
409	fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
410	where
411		V: serde::de::Visitor<'de>,
412	{
413		self.deserialize_string(visitor)
414	}
415
416	fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
417	where
418		V: serde::de::Visitor<'de>,
419	{
420		self.deserialize_string(visitor)
421	}
422
423	fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
424	where
425		V: serde::de::Visitor<'de>,
426	{
427		match self {
428			Value::String(v) => visitor.visit_string(v.into_string()),
429			_ => Err(self.invalid_type(&visitor)),
430		}
431	}
432
433	fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
434	where
435		V: serde::de::Visitor<'de>,
436	{
437		self.deserialize_byte_buf(visitor)
438	}
439
440	fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
441	where
442		V: serde::de::Visitor<'de>,
443	{
444		match self {
445			Value::String(v) => visitor.visit_string(v.into_string()),
446			Value::Array(v) => visit_array(v, visitor),
447			_ => Err(self.invalid_type(&visitor)),
448		}
449	}
450
451	fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
452	where
453		V: serde::de::Visitor<'de>,
454	{
455		match self {
456			Value::Null => visitor.visit_unit(),
457			_ => Err(self.invalid_type(&visitor)),
458		}
459	}
460
461	fn deserialize_unit_struct<V>(
462		self,
463		_name: &'static str,
464		visitor: V,
465	) -> Result<V::Value, Self::Error>
466	where
467		V: serde::de::Visitor<'de>,
468	{
469		self.deserialize_unit(visitor)
470	}
471
472	fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
473	where
474		V: serde::de::Visitor<'de>,
475	{
476		match self {
477			Value::Array(v) => visit_array(v, visitor),
478			_ => Err(self.invalid_type(&visitor)),
479		}
480	}
481
482	fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
483	where
484		V: serde::de::Visitor<'de>,
485	{
486		self.deserialize_seq(visitor)
487	}
488
489	fn deserialize_tuple_struct<V>(
490		self,
491		_name: &'static str,
492		_len: usize,
493		visitor: V,
494	) -> Result<V::Value, Self::Error>
495	where
496		V: serde::de::Visitor<'de>,
497	{
498		self.deserialize_seq(visitor)
499	}
500
501	fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
502	where
503		V: serde::de::Visitor<'de>,
504	{
505		match self {
506			Value::Object(v) => visit_object(v, visitor),
507			_ => Err(self.invalid_type(&visitor)),
508		}
509	}
510
511	fn deserialize_struct<V>(
512		self,
513		_name: &'static str,
514		_fields: &'static [&'static str],
515		visitor: V,
516	) -> Result<V::Value, Self::Error>
517	where
518		V: serde::de::Visitor<'de>,
519	{
520		match self {
521			Value::Array(v) => visit_array(v, visitor),
522			Value::Object(v) => visit_object(v, visitor),
523			_ => Err(self.invalid_type(&visitor)),
524		}
525	}
526
527	fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
528	where
529		V: serde::de::Visitor<'de>,
530	{
531		self.deserialize_string(visitor)
532	}
533
534	fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
535	where
536		V: serde::de::Visitor<'de>,
537	{
538		drop(self);
539		visitor.visit_unit()
540	}
541}
542
543fn visit_array<'de, V>(a: Array, visitor: V) -> Result<V::Value, DeserializeError>
544where
545	V: serde::de::Visitor<'de>,
546{
547	let len = a.len();
548	let mut deserializer = ArrayDeserializer::new(a);
549	let seq = visitor.visit_seq(&mut deserializer)?;
550	let remaining = deserializer.iter.len();
551	if remaining == 0 {
552		Ok(seq)
553	} else {
554		Err(serde::de::Error::invalid_length(
555			len,
556			&"fewer elements in array",
557		))
558	}
559}
560
561fn visit_object<'de, V>(o: Object, visitor: V) -> Result<V::Value, DeserializeError>
562where
563	V: serde::de::Visitor<'de>,
564{
565	let len = o.len();
566	let mut deserializer = ObjectDeserializer::new(o);
567	let map = visitor.visit_map(&mut deserializer)?;
568	let remaining = deserializer.iter.len();
569	if remaining == 0 {
570		Ok(map)
571	} else {
572		Err(serde::de::Error::invalid_length(
573			len,
574			&"fewer elements in map",
575		))
576	}
577}
578
579struct ArrayDeserializer {
580	iter: std::vec::IntoIter<Value>,
581}
582
583impl ArrayDeserializer {
584	fn new(array: Array) -> Self {
585		Self {
586			iter: array.into_iter(),
587		}
588	}
589}
590
591impl<'de> SeqAccess<'de> for ArrayDeserializer {
592	type Error = DeserializeError;
593
594	fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
595	where
596		T: DeserializeSeed<'de>,
597	{
598		match self.iter.next() {
599			Some(value) => seed.deserialize(value).map(Some),
600			None => Ok(None),
601		}
602	}
603
604	fn size_hint(&self) -> Option<usize> {
605		match self.iter.size_hint() {
606			(lower, Some(upper)) if lower == upper => Some(upper),
607			_ => None,
608		}
609	}
610}
611
612struct ObjectDeserializer {
613	iter: std::vec::IntoIter<Entry>,
614	value: Option<Value>,
615}
616
617impl ObjectDeserializer {
618	fn new(obj: Object) -> Self {
619		Self {
620			iter: obj.into_iter(),
621			value: None,
622		}
623	}
624}
625
626impl<'de> MapAccess<'de> for ObjectDeserializer {
627	type Error = DeserializeError;
628
629	fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
630	where
631		T: DeserializeSeed<'de>,
632	{
633		match self.iter.next() {
634			Some(Entry { key, value }) => {
635				self.value = Some(value);
636				let key_de = MapKeyDeserializer { key };
637				seed.deserialize(key_de).map(Some)
638			}
639			None => Ok(None),
640		}
641	}
642
643	fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
644	where
645		T: DeserializeSeed<'de>,
646	{
647		match self.value.take() {
648			Some(value) => seed.deserialize(value),
649			None => Err(serde::de::Error::custom("value is missing")),
650		}
651	}
652
653	fn size_hint(&self) -> Option<usize> {
654		match self.iter.size_hint() {
655			(lower, Some(upper)) if lower == upper => Some(upper),
656			_ => None,
657		}
658	}
659}
660
661struct MapKeyDeserializer {
662	key: Key,
663}
664
665macro_rules! deserialize_integer_key {
666	($method:ident => $visit:ident) => {
667		fn $method<V>(self, visitor: V) -> Result<V::Value, Self::Error>
668		where
669			V: serde::de::Visitor<'de>,
670		{
671			match (self.key.parse(), self.key) {
672				(Ok(integer), _) => visitor.$visit(integer),
673				(Err(_), key) => visitor.visit_string(key.into_string()),
674			}
675		}
676	};
677}
678
679impl<'de> serde::Deserializer<'de> for MapKeyDeserializer {
680	type Error = DeserializeError;
681
682	fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
683	where
684		V: serde::de::Visitor<'de>,
685	{
686		visitor.visit_string(self.key.into_string())
687	}
688
689	deserialize_integer_key!(deserialize_i8 => visit_i8);
690	deserialize_integer_key!(deserialize_i16 => visit_i16);
691	deserialize_integer_key!(deserialize_i32 => visit_i32);
692	deserialize_integer_key!(deserialize_i64 => visit_i64);
693	deserialize_integer_key!(deserialize_i128 => visit_i128);
694	deserialize_integer_key!(deserialize_u8 => visit_u8);
695	deserialize_integer_key!(deserialize_u16 => visit_u16);
696	deserialize_integer_key!(deserialize_u32 => visit_u32);
697	deserialize_integer_key!(deserialize_u64 => visit_u64);
698	deserialize_integer_key!(deserialize_u128 => visit_u128);
699
700	#[inline]
701	fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
702	where
703		V: serde::de::Visitor<'de>,
704	{
705		// Map keys cannot be null.
706		visitor.visit_some(self)
707	}
708
709	#[inline]
710	fn deserialize_newtype_struct<V>(
711		self,
712		_name: &'static str,
713		visitor: V,
714	) -> Result<V::Value, Self::Error>
715	where
716		V: serde::de::Visitor<'de>,
717	{
718		visitor.visit_newtype_struct(self)
719	}
720
721	fn deserialize_enum<V>(
722		self,
723		name: &'static str,
724		variants: &'static [&'static str],
725		visitor: V,
726	) -> Result<V::Value, Self::Error>
727	where
728		V: serde::de::Visitor<'de>,
729	{
730		self.key
731			.into_deserializer()
732			.deserialize_enum(name, variants, visitor)
733	}
734
735	forward_to_deserialize_any! {
736		bool f32 f64 char str string bytes byte_buf unit unit_struct seq tuple
737		tuple_struct map struct identifier ignored_any
738	}
739}
740
741struct EnumDeserializer {
742	variant: Key,
743	value: Option<Value>,
744}
745
746impl<'de> EnumAccess<'de> for EnumDeserializer {
747	type Error = DeserializeError;
748	type Variant = VariantDeserializer;
749
750	fn variant_seed<V>(self, seed: V) -> Result<(V::Value, VariantDeserializer), Self::Error>
751	where
752		V: DeserializeSeed<'de>,
753	{
754		let variant = self.variant.into_deserializer();
755		let visitor = VariantDeserializer { value: self.value };
756		seed.deserialize(variant).map(|v| (v, visitor))
757	}
758}
759
760struct VariantDeserializer {
761	value: Option<Value>,
762}
763
764impl<'de> VariantAccess<'de> for VariantDeserializer {
765	type Error = DeserializeError;
766
767	fn unit_variant(self) -> Result<(), Self::Error> {
768		match self.value {
769			Some(value) => serde::Deserialize::deserialize(value),
770			None => Ok(()),
771		}
772	}
773
774	fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
775	where
776		T: DeserializeSeed<'de>,
777	{
778		match self.value {
779			Some(value) => seed.deserialize(value),
780			None => Err(serde::de::Error::invalid_type(
781				Unexpected::UnitVariant,
782				&"newtype variant",
783			)),
784		}
785	}
786
787	fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
788	where
789		V: serde::de::Visitor<'de>,
790	{
791		match self.value {
792			Some(Value::Array(v)) => {
793				if v.is_empty() {
794					visitor.visit_unit()
795				} else {
796					visit_array(v, visitor)
797				}
798			}
799			Some(other) => Err(serde::de::Error::invalid_type(
800				other.unexpected(),
801				&"tuple variant",
802			)),
803			None => Err(serde::de::Error::invalid_type(
804				Unexpected::UnitVariant,
805				&"tuple variant",
806			)),
807		}
808	}
809
810	fn struct_variant<V>(
811		self,
812		_fields: &'static [&'static str],
813		visitor: V,
814	) -> Result<V::Value, Self::Error>
815	where
816		V: serde::de::Visitor<'de>,
817	{
818		match self.value {
819			Some(Value::Object(v)) => visit_object(v, visitor),
820			Some(other) => Err(serde::de::Error::invalid_type(
821				other.unexpected(),
822				&"struct variant",
823			)),
824			None => Err(serde::de::Error::invalid_type(
825				Unexpected::UnitVariant,
826				&"struct variant",
827			)),
828		}
829	}
830}