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