1use std::{
2 borrow::Cow,
3 convert::{TryFrom, TryInto},
4 fmt,
5 vec,
6};
7
8use serde::de::{
9 self,
10 Deserialize,
11 DeserializeSeed,
12 Deserializer as _,
13 EnumAccess,
14 Error as _,
15 MapAccess,
16 SeqAccess,
17 Unexpected,
18 VariantAccess,
19 Visitor,
20};
21use serde_bytes::ByteBuf;
22
23use crate::{
24 bson::{Bson, DbPointer, JavaScriptCodeWithScope, Regex, Timestamp},
25 datetime::DateTime,
26 document::{Document, IntoIter},
27 error::{Error, Result},
28 oid::ObjectId,
29 raw::{RawBsonRef, RAW_ARRAY_NEWTYPE, RAW_BSON_NEWTYPE, RAW_DOCUMENT_NEWTYPE},
30 serde_helpers::HUMAN_READABLE_NEWTYPE,
31 spec::BinarySubtype,
32 uuid::UUID_NEWTYPE_NAME,
33 Binary,
34 Decimal128,
35};
36
37use super::{raw::Decimal128Access, DeserializerHint};
38
39pub(crate) struct BsonVisitor;
40
41struct ObjectIdVisitor;
42
43impl<'de> Visitor<'de> for ObjectIdVisitor {
44 type Value = ObjectId;
45
46 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
47 formatter.write_str("expecting an ObjectId")
48 }
49
50 #[inline]
51 fn visit_str<E>(self, value: &str) -> std::result::Result<Self::Value, E>
52 where
53 E: serde::de::Error,
54 {
55 ObjectId::parse_str(value).map_err(|_| {
56 E::invalid_value(
57 Unexpected::Str(value),
58 &"24-character, big-endian hex string",
59 )
60 })
61 }
62
63 #[inline]
64 fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
65 where
66 E: serde::de::Error,
67 {
68 let bytes: [u8; 12] = v
69 .try_into()
70 .map_err(|_| E::invalid_length(v.len(), &"12 bytes"))?;
71 Ok(ObjectId::from_bytes(bytes))
72 }
73
74 #[inline]
75 fn visit_map<V>(self, mut visitor: V) -> std::result::Result<Self::Value, V::Error>
76 where
77 V: MapAccess<'de>,
78 {
79 match BsonVisitor.visit_map(&mut visitor)? {
80 Bson::ObjectId(oid) => Ok(oid),
81 bson => {
82 let err = format!(
83 "expected map containing extended-JSON formatted ObjectId, instead found {}",
84 bson
85 );
86 Err(serde::de::Error::custom(err))
87 }
88 }
89 }
90}
91
92impl<'de> Deserialize<'de> for ObjectId {
93 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
94 where
95 D: serde::Deserializer<'de>,
96 {
97 if !deserializer.is_human_readable() {
98 deserializer.deserialize_bytes(ObjectIdVisitor)
99 } else {
100 deserializer.deserialize_any(ObjectIdVisitor)
101 }
102 }
103}
104
105impl<'de> Deserialize<'de> for Document {
106 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
108 where
109 D: de::Deserializer<'de>,
110 {
111 deserializer.deserialize_map(BsonVisitor).and_then(|bson| {
112 if let Bson::Document(doc) = bson {
113 Ok(doc)
114 } else {
115 let err = format!("expected document, found extended JSON data type: {}", bson);
116 Err(serde::de::Error::invalid_type(Unexpected::Map, &&err[..]))
117 }
118 })
119 }
120}
121
122impl<'de> Deserialize<'de> for Bson {
123 #[inline]
124 fn deserialize<D>(deserializer: D) -> std::result::Result<Bson, D::Error>
125 where
126 D: de::Deserializer<'de>,
127 {
128 deserializer.deserialize_any(BsonVisitor)
129 }
130}
131
132impl<'de> Visitor<'de> for BsonVisitor {
133 type Value = Bson;
134
135 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
136 f.write_str("a Bson")
137 }
138
139 #[inline]
140 fn visit_bool<E>(self, value: bool) -> std::result::Result<Bson, E>
141 where
142 E: serde::de::Error,
143 {
144 Ok(Bson::Boolean(value))
145 }
146
147 #[inline]
148 fn visit_i8<E>(self, value: i8) -> std::result::Result<Bson, E>
149 where
150 E: serde::de::Error,
151 {
152 Ok(Bson::Int32(value as i32))
153 }
154
155 #[inline]
156 fn visit_u8<E>(self, value: u8) -> std::result::Result<Bson, E>
157 where
158 E: serde::de::Error,
159 {
160 convert_unsigned_to_signed(value as u64)
161 }
162
163 #[inline]
164 fn visit_i16<E>(self, value: i16) -> std::result::Result<Bson, E>
165 where
166 E: serde::de::Error,
167 {
168 Ok(Bson::Int32(value as i32))
169 }
170
171 #[inline]
172 fn visit_u16<E>(self, value: u16) -> std::result::Result<Bson, E>
173 where
174 E: serde::de::Error,
175 {
176 convert_unsigned_to_signed(value as u64)
177 }
178
179 #[inline]
180 fn visit_i32<E>(self, value: i32) -> std::result::Result<Bson, E>
181 where
182 E: serde::de::Error,
183 {
184 Ok(Bson::Int32(value))
185 }
186
187 #[inline]
188 fn visit_u32<E>(self, value: u32) -> std::result::Result<Bson, E>
189 where
190 E: serde::de::Error,
191 {
192 convert_unsigned_to_signed(value as u64)
193 }
194
195 #[inline]
196 fn visit_i64<E>(self, value: i64) -> std::result::Result<Bson, E>
197 where
198 E: serde::de::Error,
199 {
200 Ok(Bson::Int64(value))
201 }
202
203 #[inline]
204 fn visit_u64<E>(self, value: u64) -> std::result::Result<Bson, E>
205 where
206 E: serde::de::Error,
207 {
208 convert_unsigned_to_signed(value)
209 }
210
211 #[inline]
212 fn visit_f64<E>(self, value: f64) -> std::result::Result<Bson, E> {
213 Ok(Bson::Double(value))
214 }
215
216 #[inline]
217 fn visit_str<E>(self, value: &str) -> std::result::Result<Bson, E>
218 where
219 E: serde::de::Error,
220 {
221 self.visit_string(String::from(value))
222 }
223
224 #[inline]
225 fn visit_string<E>(self, value: String) -> std::result::Result<Bson, E> {
226 Ok(Bson::String(value))
227 }
228
229 #[inline]
230 fn visit_none<E>(self) -> std::result::Result<Bson, E> {
231 Ok(Bson::Null)
232 }
233
234 #[inline]
235 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Bson, D::Error>
236 where
237 D: de::Deserializer<'de>,
238 {
239 deserializer.deserialize_any(self)
240 }
241
242 #[inline]
243 fn visit_unit<E>(self) -> std::result::Result<Bson, E> {
244 Ok(Bson::Null)
245 }
246
247 #[inline]
248 fn visit_seq<V>(self, mut visitor: V) -> std::result::Result<Bson, V::Error>
249 where
250 V: SeqAccess<'de>,
251 {
252 let mut values = Vec::new();
253
254 while let Some(elem) = visitor.next_element()? {
255 values.push(elem);
256 }
257
258 Ok(Bson::Array(values))
259 }
260
261 fn visit_map<V>(self, mut visitor: V) -> std::result::Result<Bson, V::Error>
262 where
263 V: MapAccess<'de>,
264 {
265 use crate::extjson;
266
267 let mut doc = Document::new();
268
269 while let Some(k) = visitor.next_key::<String>()? {
270 match k.as_str() {
271 "$oid" => {
272 enum BytesOrHex<'a> {
273 Bytes([u8; 12]),
274 Hex(Cow<'a, str>),
275 }
276
277 impl<'a, 'de: 'a> Deserialize<'de> for BytesOrHex<'a> {
278 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
279 where
280 D: serde::Deserializer<'de>,
281 {
282 struct BytesOrHexVisitor;
283
284 impl<'de> Visitor<'de> for BytesOrHexVisitor {
285 type Value = BytesOrHex<'de>;
286
287 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
288 write!(formatter, "hexstring or byte array")
289 }
290
291 fn visit_str<E>(
292 self,
293 v: &str,
294 ) -> std::result::Result<Self::Value, E>
295 where
296 E: serde::de::Error,
297 {
298 Ok(BytesOrHex::Hex(Cow::Owned(v.to_string())))
299 }
300
301 fn visit_borrowed_str<E>(
302 self,
303 v: &'de str,
304 ) -> std::result::Result<Self::Value, E>
305 where
306 E: serde::de::Error,
307 {
308 Ok(BytesOrHex::Hex(Cow::Borrowed(v)))
309 }
310
311 fn visit_bytes<E>(
312 self,
313 v: &[u8],
314 ) -> std::result::Result<Self::Value, E>
315 where
316 E: serde::de::Error,
317 {
318 Ok(BytesOrHex::Bytes(
319 v.try_into().map_err(serde::de::Error::custom)?,
320 ))
321 }
322 }
323
324 deserializer.deserialize_any(BytesOrHexVisitor)
325 }
326 }
327
328 let bytes_or_hex: BytesOrHex = visitor.next_value()?;
329 match bytes_or_hex {
330 BytesOrHex::Bytes(b) => return Ok(Bson::ObjectId(ObjectId::from_bytes(b))),
331 BytesOrHex::Hex(hex) => {
332 return Ok(Bson::ObjectId(ObjectId::parse_str(&hex).map_err(
333 |_| {
334 V::Error::invalid_value(
335 Unexpected::Str(&hex),
336 &"24-character, big-endian hex string",
337 )
338 },
339 )?));
340 }
341 }
342 }
343 "$symbol" => {
344 let string: String = visitor.next_value()?;
345 return Ok(Bson::Symbol(string));
346 }
347
348 "$numberInt" => {
349 let string: String = visitor.next_value()?;
350 return Ok(Bson::Int32(string.parse().map_err(|_| {
351 V::Error::invalid_value(
352 Unexpected::Str(&string),
353 &"32-bit signed integer as a string",
354 )
355 })?));
356 }
357
358 "$numberLong" => {
359 let string: String = visitor.next_value()?;
360 return Ok(Bson::Int64(string.parse().map_err(|_| {
361 V::Error::invalid_value(
362 Unexpected::Str(&string),
363 &"64-bit signed integer as a string",
364 )
365 })?));
366 }
367
368 "$numberDouble" => {
369 let string: String = visitor.next_value()?;
370 let val = match string.as_str() {
371 "Infinity" => Bson::Double(f64::INFINITY),
372 "-Infinity" => Bson::Double(f64::NEG_INFINITY),
373 "NaN" => Bson::Double(f64::NAN),
374 _ => Bson::Double(string.parse().map_err(|_| {
375 V::Error::invalid_value(
376 Unexpected::Str(&string),
377 &"64-bit signed integer as a string",
378 )
379 })?),
380 };
381 return Ok(val);
382 }
383
384 "$binary" => {
385 let v = visitor.next_value::<extjson::models::BinaryBody>()?;
386 return Ok(Bson::Binary(
387 extjson::models::Binary { body: v }
388 .parse()
389 .map_err(serde::de::Error::custom)?,
390 ));
391 }
392
393 "$uuid" => {
394 let v: String = visitor.next_value()?;
395 let uuid = extjson::models::Uuid { value: v }
396 .parse()
397 .map_err(serde::de::Error::custom)?;
398 return Ok(Bson::Binary(uuid));
399 }
400
401 "$code" => {
402 let code = visitor.next_value::<String>()?;
403 if let Some(key) = visitor.next_key::<String>()? {
404 if key.as_str() == "$scope" {
405 let scope = visitor.next_value::<Document>()?;
406 return Ok(Bson::JavaScriptCodeWithScope(JavaScriptCodeWithScope {
407 code,
408 scope,
409 }));
410 } else {
411 return Err(serde::de::Error::unknown_field(key.as_str(), &["$scope"]));
412 }
413 } else {
414 return Ok(Bson::JavaScriptCode(code));
415 }
416 }
417
418 "$scope" => {
419 let scope = visitor.next_value::<Document>()?;
420 if let Some(key) = visitor.next_key::<String>()? {
421 if key.as_str() == "$code" {
422 let code = visitor.next_value::<String>()?;
423 return Ok(Bson::JavaScriptCodeWithScope(JavaScriptCodeWithScope {
424 code,
425 scope,
426 }));
427 } else {
428 return Err(serde::de::Error::unknown_field(key.as_str(), &["$code"]));
429 }
430 } else {
431 return Err(serde::de::Error::missing_field("$code"));
432 }
433 }
434
435 "$timestamp" => {
436 let ts = visitor.next_value::<extjson::models::TimestampBody>()?;
437 return Ok(Bson::Timestamp(Timestamp {
438 time: ts.t,
439 increment: ts.i,
440 }));
441 }
442
443 "$regularExpression" => {
444 let re = visitor.next_value::<extjson::models::RegexBody>()?;
445 return Ok(Bson::RegularExpression(
446 Regex::from_strings(re.pattern, re.options)
447 .map_err(serde::de::Error::custom)?,
448 ));
449 }
450
451 "$dbPointer" => {
452 let dbp = visitor.next_value::<extjson::models::DbPointerBody>()?;
453 return Ok(Bson::DbPointer(DbPointer {
454 id: dbp.id.parse().map_err(serde::de::Error::custom)?,
455 namespace: dbp.ref_ns,
456 }));
457 }
458
459 "$date" => {
460 let dt = visitor.next_value::<extjson::models::DateTimeBody>()?;
461 return Ok(Bson::DateTime(
462 extjson::models::DateTime { body: dt }
463 .parse()
464 .map_err(serde::de::Error::custom)?,
465 ));
466 }
467
468 "$maxKey" => {
469 let i = visitor.next_value::<u8>()?;
470 return extjson::models::MaxKey { value: i }
471 .parse()
472 .map_err(serde::de::Error::custom);
473 }
474
475 "$minKey" => {
476 let i = visitor.next_value::<u8>()?;
477 return extjson::models::MinKey { value: i }
478 .parse()
479 .map_err(serde::de::Error::custom);
480 }
481
482 "$undefined" => {
483 let b = visitor.next_value::<bool>()?;
484 return extjson::models::Undefined { value: b }
485 .parse()
486 .map_err(serde::de::Error::custom);
487 }
488
489 "$numberDecimal" => {
490 let string: String = visitor.next_value()?;
491 return Ok(Bson::Decimal128(string.parse::<Decimal128>().map_err(
492 |_| {
493 V::Error::invalid_value(
494 Unexpected::Str(&string),
495 &"decimal128 as a string",
496 )
497 },
498 )?));
499 }
500
501 "$numberDecimalBytes" => {
502 let bytes = visitor.next_value::<ByteBuf>()?;
503 return Ok(Bson::Decimal128(Decimal128::deserialize_from_slice(
504 &bytes,
505 )?));
506 }
507
508 k => {
509 let v = visitor.next_value::<Bson>()?;
510 doc.insert(k, v);
511 }
512 }
513 }
514
515 Ok(Bson::Document(doc))
516 }
517
518 #[inline]
519 fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Bson, E>
520 where
521 E: serde::de::Error,
522 {
523 Ok(Bson::Binary(Binary {
524 subtype: BinarySubtype::Generic,
525 bytes: v.to_vec(),
526 }))
527 }
528
529 #[inline]
530 fn visit_byte_buf<E>(self, v: Vec<u8>) -> std::result::Result<Bson, E>
531 where
532 E: serde::de::Error,
533 {
534 Ok(Bson::Binary(Binary {
535 subtype: BinarySubtype::Generic,
536 bytes: v,
537 }))
538 }
539
540 #[inline]
541 fn visit_newtype_struct<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
542 where
543 D: serde::Deserializer<'de>,
544 {
545 deserializer.deserialize_any(self)
546 }
547}
548
549enum BsonInteger {
550 Int32(i32),
551 Int64(i64),
552}
553
554fn convert_unsigned<E: serde::de::Error>(value: u64) -> std::result::Result<BsonInteger, E> {
555 if let Ok(int32) = i32::try_from(value) {
556 Ok(BsonInteger::Int32(int32))
557 } else if let Ok(int64) = i64::try_from(value) {
558 Ok(BsonInteger::Int64(int64))
559 } else {
560 Err(serde::de::Error::custom(format!(
561 "cannot represent {} as a signed number",
562 value
563 )))
564 }
565}
566
567fn convert_unsigned_to_signed<E>(value: u64) -> std::result::Result<Bson, E>
568where
569 E: serde::de::Error,
570{
571 let bi = convert_unsigned(value)?;
572 match bi {
573 BsonInteger::Int32(i) => Ok(Bson::Int32(i)),
574 BsonInteger::Int64(i) => Ok(Bson::Int64(i)),
575 }
576}
577
578pub(crate) fn convert_unsigned_to_signed_raw<'a, E>(
579 value: u64,
580) -> std::result::Result<RawBsonRef<'a>, E>
581where
582 E: serde::de::Error,
583{
584 let bi = convert_unsigned(value)?;
585 match bi {
586 BsonInteger::Int32(i) => Ok(RawBsonRef::Int32(i)),
587 BsonInteger::Int64(i) => Ok(RawBsonRef::Int64(i)),
588 }
589}
590
591pub struct Deserializer {
593 value: Option<Bson>,
594 options: DeserializerOptions,
595}
596
597#[derive(Debug, Clone, Default)]
599#[non_exhaustive]
600pub(crate) struct DeserializerOptions {
601 pub(crate) human_readable: Option<bool>,
604}
605
606impl Deserializer {
607 pub fn new(value: Bson) -> Deserializer {
609 Deserializer::new_with_options(value, Default::default())
610 }
611
612 pub(crate) fn new_with_options(value: Bson, options: DeserializerOptions) -> Self {
614 Deserializer {
615 value: Some(value),
616 options,
617 }
618 }
619
620 fn deserialize_next<'de, V>(mut self, visitor: V, hint: DeserializerHint) -> Result<V::Value>
621 where
622 V: serde::de::Visitor<'de>,
623 {
624 let value = match self.value.take() {
625 Some(value) => value,
626 None => return Err(Error::end_of_stream()),
627 };
628
629 let is_rawbson = matches!(hint, DeserializerHint::RawBson);
630
631 if let DeserializerHint::BinarySubtype(expected_subtype) = hint {
632 if let Bson::Binary(ref binary) = value {
633 if binary.subtype != expected_subtype {
634 return Err(serde::de::Error::custom(format!(
635 "expected Binary with subtype {:?}, instead got subtype {:?}",
636 expected_subtype, binary.subtype
637 )));
638 }
639 }
640 };
641
642 match value {
643 Bson::Double(v) => visitor.visit_f64(v),
644 Bson::String(v) => visitor.visit_string(v),
645 Bson::Array(v) => {
646 let len = v.len();
647 visitor.visit_seq(SeqDeserializer {
648 iter: v.into_iter(),
649 options: self.options,
650 len,
651 })
652 }
653 Bson::Document(v) => visitor.visit_map(MapDeserializer::new(v, self.options)),
654 Bson::Boolean(v) => visitor.visit_bool(v),
655 Bson::Null => visitor.visit_unit(),
656 Bson::Int32(v) => visitor.visit_i32(v),
657 Bson::Int64(v) => visitor.visit_i64(v),
658 Bson::Binary(b) if b.subtype == BinarySubtype::Generic => {
659 visitor.visit_byte_buf(b.bytes)
660 }
661 Bson::Decimal128(d) => visitor.visit_map(Decimal128Access::new(d)),
662 _ => {
663 let doc = value.into_extended_document(is_rawbson);
664 visitor.visit_map(MapDeserializer::new(doc, self.options))
665 }
666 }
667 }
668}
669
670macro_rules! forward_to_deserialize {
671 ($(
672 $name:ident ( $( $arg:ident : $ty:ty ),* );
673 )*) => {
674 $(
675 forward_to_deserialize!{
676 func: $name ( $( $arg: $ty ),* );
677 }
678 )*
679 };
680
681 (func: deserialize_enum ( $( $arg:ident : $ty:ty ),* );) => {
682 fn deserialize_enum<V>(
683 self,
684 $(_: $ty,)*
685 _visitor: V,
686 ) -> ::std::result::Result<V::Value, Self::Error>
687 where V: ::serde::de::Visitor<'de>
688 {
689 Err(::serde::de::Error::custom("unexpected Enum"))
690 }
691 };
692
693 (func: $name:ident ( $( $arg:ident : $ty:ty ),* );) => {
694 #[inline]
695 fn $name<V>(
696 self,
697 $(_: $ty,)*
698 visitor: V,
699 ) -> ::std::result::Result<V::Value, Self::Error>
700 where V: ::serde::de::Visitor<'de>
701 {
702 self.deserialize_any(visitor)
703 }
704 };
705}
706
707impl<'de> de::Deserializer<'de> for Deserializer {
708 type Error = Error;
709
710 #[allow(deprecated)]
711 fn is_human_readable(&self) -> bool {
712 self.options.human_readable.unwrap_or(true)
713 }
714
715 #[inline]
716 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
717 where
718 V: Visitor<'de>,
719 {
720 self.deserialize_next(visitor, DeserializerHint::None)
721 }
722
723 #[inline]
724 fn deserialize_bytes<V>(self, visitor: V) -> std::result::Result<V::Value, Self::Error>
725 where
726 V: Visitor<'de>,
727 {
728 match self.value {
729 Some(Bson::ObjectId(oid)) if !self.is_human_readable() => {
730 visitor.visit_bytes(&oid.bytes())
731 }
732 _ => self.deserialize_any(visitor),
733 }
734 }
735
736 #[inline]
737 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
738 where
739 V: Visitor<'de>,
740 {
741 match self.value {
742 Some(Bson::Null) => visitor.visit_none(),
743 Some(_) => visitor.visit_some(self),
744 None => Err(Error::end_of_stream()),
745 }
746 }
747
748 #[inline]
749 fn deserialize_enum<V>(
750 mut self,
751 _name: &str,
752 _variants: &'static [&'static str],
753 visitor: V,
754 ) -> Result<V::Value>
755 where
756 V: Visitor<'de>,
757 {
758 let value = match self.value.take() {
759 Some(Bson::Document(value)) => value,
760 Some(Bson::String(variant)) => {
761 return visitor.visit_enum(EnumDeserializer {
762 val: Bson::String(variant),
763 deserializer: VariantDeserializer {
764 val: None,
765 options: self.options,
766 },
767 });
768 }
769 Some(v) => {
770 return Err(Error::invalid_type(v.as_unexpected(), &"expected an enum"));
771 }
772 None => {
773 return Err(Error::end_of_stream());
774 }
775 };
776
777 let mut iter = value.into_iter();
778
779 let (variant, value) = match iter.next() {
780 Some(v) => v,
781 None => {
782 return Err(Error::invalid_value(
783 Unexpected::Other("empty document"),
784 &"variant name",
785 ))
786 }
787 };
788
789 match iter.next() {
791 Some((k, _)) => Err(Error::invalid_value(
792 Unexpected::Map,
793 &format!("expected map with a single key, got extra key \"{}\"", k).as_str(),
794 )),
795 None => visitor.visit_enum(EnumDeserializer {
796 val: Bson::String(variant),
797 deserializer: VariantDeserializer {
798 val: Some(value),
799 options: self.options,
800 },
801 }),
802 }
803 }
804
805 #[inline]
806 fn deserialize_newtype_struct<V>(mut self, name: &'static str, visitor: V) -> Result<V::Value>
807 where
808 V: Visitor<'de>,
809 {
810 match name {
811 UUID_NEWTYPE_NAME => self.deserialize_next(
812 visitor,
813 DeserializerHint::BinarySubtype(BinarySubtype::Uuid),
814 ),
815 RAW_BSON_NEWTYPE => self.deserialize_next(visitor, DeserializerHint::RawBson),
816 RAW_DOCUMENT_NEWTYPE => {
817 if !matches!(self.value, Some(Bson::Document(_))) {
818 return Err(serde::de::Error::custom(format!(
819 "expected raw document, instead got {:?}",
820 self.value
821 )));
822 }
823
824 self.deserialize_next(visitor, DeserializerHint::RawBson)
825 }
826 RAW_ARRAY_NEWTYPE => {
827 if !matches!(self.value, Some(Bson::Array(_))) {
828 return Err(serde::de::Error::custom(format!(
829 "expected raw array, instead got {:?}",
830 self.value
831 )));
832 }
833
834 self.deserialize_next(visitor, DeserializerHint::RawBson)
835 }
836 #[allow(deprecated)]
837 HUMAN_READABLE_NEWTYPE => {
838 self.options.human_readable = Some(true);
839 visitor.visit_newtype_struct(self)
840 }
841 _ => visitor.visit_newtype_struct(self),
842 }
843 }
844
845 forward_to_deserialize! {
846 deserialize_bool();
847 deserialize_u8();
848 deserialize_u16();
849 deserialize_u32();
850 deserialize_u64();
851 deserialize_i8();
852 deserialize_i16();
853 deserialize_i32();
854 deserialize_i64();
855 deserialize_f32();
856 deserialize_f64();
857 deserialize_char();
858 deserialize_str();
859 deserialize_string();
860 deserialize_unit();
861 deserialize_seq();
862 deserialize_map();
863 deserialize_unit_struct(name: &'static str);
864 deserialize_tuple_struct(name: &'static str, len: usize);
865 deserialize_struct(name: &'static str, fields: &'static [&'static str]);
866 deserialize_tuple(len: usize);
867 deserialize_identifier();
868 deserialize_ignored_any();
869 deserialize_byte_buf();
870 }
871}
872
873struct EnumDeserializer {
874 val: Bson,
875 deserializer: VariantDeserializer,
876}
877
878impl<'de> EnumAccess<'de> for EnumDeserializer {
879 type Error = Error;
880 type Variant = VariantDeserializer;
881 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
882 where
883 V: DeserializeSeed<'de>,
884 {
885 let dec = Deserializer::new_with_options(self.val, self.deserializer.options.clone());
886 let value = seed.deserialize(dec)?;
887 Ok((value, self.deserializer))
888 }
889}
890
891struct VariantDeserializer {
892 val: Option<Bson>,
893 options: DeserializerOptions,
894}
895
896impl<'de> VariantAccess<'de> for VariantDeserializer {
897 type Error = Error;
898
899 fn unit_variant(mut self) -> Result<()> {
900 match self.val.take() {
901 None => Ok(()),
902 Some(val) => {
903 Bson::deserialize(Deserializer::new_with_options(val, self.options)).map(|_| ())
904 }
905 }
906 }
907
908 fn newtype_variant_seed<T>(mut self, seed: T) -> Result<T::Value>
909 where
910 T: DeserializeSeed<'de>,
911 {
912 let dec = Deserializer::new_with_options(
913 self.val.take().ok_or_else(Error::end_of_stream)?,
914 self.options,
915 );
916 seed.deserialize(dec)
917 }
918
919 fn tuple_variant<V>(mut self, _len: usize, visitor: V) -> Result<V::Value>
920 where
921 V: Visitor<'de>,
922 {
923 match self.val.take().ok_or_else(Error::end_of_stream)? {
924 Bson::Array(fields) => {
925 let de = SeqDeserializer {
926 len: fields.len(),
927 iter: fields.into_iter(),
928 options: self.options,
929 };
930 de.deserialize_any(visitor)
931 }
932 other => Err(Error::invalid_type(
933 other.as_unexpected(),
934 &"expected a tuple",
935 )),
936 }
937 }
938
939 fn struct_variant<V>(mut self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
940 where
941 V: Visitor<'de>,
942 {
943 match self.val.take().ok_or_else(Error::end_of_stream)? {
944 Bson::Document(fields) => {
945 let de = MapDeserializer {
946 len: fields.len(),
947 iter: fields.into_iter(),
948 value: None,
949 options: self.options,
950 };
951 de.deserialize_any(visitor)
952 }
953 ref other => Err(Error::invalid_type(
954 other.as_unexpected(),
955 &"expected a struct",
956 )),
957 }
958 }
959}
960
961struct SeqDeserializer {
962 iter: vec::IntoIter<Bson>,
963 len: usize,
964 options: DeserializerOptions,
965}
966
967impl<'de> de::Deserializer<'de> for SeqDeserializer {
968 type Error = Error;
969
970 #[inline]
971 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
972 where
973 V: Visitor<'de>,
974 {
975 if self.len == 0 {
976 visitor.visit_unit()
977 } else {
978 visitor.visit_seq(self)
979 }
980 }
981
982 forward_to_deserialize! {
983 deserialize_bool();
984 deserialize_u8();
985 deserialize_u16();
986 deserialize_u32();
987 deserialize_u64();
988 deserialize_i8();
989 deserialize_i16();
990 deserialize_i32();
991 deserialize_i64();
992 deserialize_f32();
993 deserialize_f64();
994 deserialize_char();
995 deserialize_str();
996 deserialize_string();
997 deserialize_unit();
998 deserialize_option();
999 deserialize_seq();
1000 deserialize_bytes();
1001 deserialize_map();
1002 deserialize_unit_struct(name: &'static str);
1003 deserialize_newtype_struct(name: &'static str);
1004 deserialize_tuple_struct(name: &'static str, len: usize);
1005 deserialize_struct(name: &'static str, fields: &'static [&'static str]);
1006 deserialize_tuple(len: usize);
1007 deserialize_enum(name: &'static str, variants: &'static [&'static str]);
1008 deserialize_identifier();
1009 deserialize_ignored_any();
1010 deserialize_byte_buf();
1011 }
1012}
1013
1014impl<'de> SeqAccess<'de> for SeqDeserializer {
1015 type Error = Error;
1016
1017 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
1018 where
1019 T: DeserializeSeed<'de>,
1020 {
1021 match self.iter.next() {
1022 None => Ok(None),
1023 Some(value) => {
1024 self.len -= 1;
1025 let de = Deserializer::new_with_options(value, self.options.clone());
1026 match seed.deserialize(de) {
1027 Ok(value) => Ok(Some(value)),
1028 Err(err) => Err(err),
1029 }
1030 }
1031 }
1032 }
1033
1034 fn size_hint(&self) -> Option<usize> {
1035 Some(self.len)
1036 }
1037}
1038
1039pub(crate) struct MapDeserializer {
1040 pub(crate) iter: IntoIter,
1041 pub(crate) value: Option<Bson>,
1042 pub(crate) len: usize,
1043 pub(crate) options: DeserializerOptions,
1044}
1045
1046impl MapDeserializer {
1047 pub(crate) fn new(doc: Document, options: impl Into<Option<DeserializerOptions>>) -> Self {
1048 let len = doc.len();
1049 MapDeserializer {
1050 iter: doc.into_iter(),
1051 len,
1052 value: None,
1053 options: options.into().unwrap_or_default(),
1054 }
1055 }
1056}
1057
1058impl<'de> MapAccess<'de> for MapDeserializer {
1059 type Error = Error;
1060
1061 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
1062 where
1063 K: DeserializeSeed<'de>,
1064 {
1065 match self.iter.next() {
1066 Some((key, value)) => {
1067 self.len -= 1;
1068 self.value = Some(value);
1069
1070 let de = Deserializer::new_with_options(Bson::String(key), self.options.clone());
1071 match seed.deserialize(de) {
1072 Ok(val) => Ok(Some(val)),
1073 Err(e) => Err(e),
1074 }
1075 }
1076 None => Ok(None),
1077 }
1078 }
1079
1080 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
1081 where
1082 V: DeserializeSeed<'de>,
1083 {
1084 let value = self.value.take().ok_or_else(Error::end_of_stream)?;
1085 let de = Deserializer::new_with_options(value, self.options.clone());
1086 seed.deserialize(de)
1087 }
1088
1089 fn size_hint(&self) -> Option<usize> {
1090 Some(self.len)
1091 }
1092}
1093
1094impl<'de> de::Deserializer<'de> for MapDeserializer {
1095 type Error = Error;
1096
1097 #[inline]
1098 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
1099 where
1100 V: Visitor<'de>,
1101 {
1102 visitor.visit_map(self)
1103 }
1104
1105 forward_to_deserialize! {
1106 deserialize_bool();
1107 deserialize_u8();
1108 deserialize_u16();
1109 deserialize_u32();
1110 deserialize_u64();
1111 deserialize_i8();
1112 deserialize_i16();
1113 deserialize_i32();
1114 deserialize_i64();
1115 deserialize_f32();
1116 deserialize_f64();
1117 deserialize_char();
1118 deserialize_str();
1119 deserialize_string();
1120 deserialize_unit();
1121 deserialize_option();
1122 deserialize_seq();
1123 deserialize_bytes();
1124 deserialize_map();
1125 deserialize_unit_struct(name: &'static str);
1126 deserialize_newtype_struct(name: &'static str);
1127 deserialize_tuple_struct(name: &'static str, len: usize);
1128 deserialize_struct(name: &'static str, fields: &'static [&'static str]);
1129 deserialize_tuple(len: usize);
1130 deserialize_enum(name: &'static str, variants: &'static [&'static str]);
1131 deserialize_identifier();
1132 deserialize_ignored_any();
1133 deserialize_byte_buf();
1134 }
1135}
1136
1137impl<'de> Deserialize<'de> for Timestamp {
1138 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1139 where
1140 D: de::Deserializer<'de>,
1141 {
1142 match Bson::deserialize(deserializer)? {
1143 Bson::Timestamp(timestamp) => Ok(timestamp),
1144 _ => Err(serde::de::Error::custom("expecting Timestamp")),
1145 }
1146 }
1147}
1148
1149impl<'de> Deserialize<'de> for Regex {
1150 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1151 where
1152 D: de::Deserializer<'de>,
1153 {
1154 match Bson::deserialize(deserializer)? {
1155 Bson::RegularExpression(regex) => Ok(regex),
1156 _ => Err(serde::de::Error::custom("expecting Regex")),
1157 }
1158 }
1159}
1160
1161impl<'de> Deserialize<'de> for JavaScriptCodeWithScope {
1162 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1163 where
1164 D: de::Deserializer<'de>,
1165 {
1166 match Bson::deserialize(deserializer)? {
1167 Bson::JavaScriptCodeWithScope(code_with_scope) => Ok(code_with_scope),
1168 _ => Err(serde::de::Error::custom(
1169 "expecting JavaScriptCodeWithScope",
1170 )),
1171 }
1172 }
1173}
1174
1175impl<'de> Deserialize<'de> for Binary {
1176 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1177 where
1178 D: de::Deserializer<'de>,
1179 {
1180 match Bson::deserialize(deserializer)? {
1181 Bson::Binary(binary) => Ok(binary),
1182 d => Err(serde::de::Error::custom(format!(
1183 "expecting Binary but got {:?} instead",
1184 d
1185 ))),
1186 }
1187 }
1188}
1189
1190impl<'de> Deserialize<'de> for Decimal128 {
1191 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1192 where
1193 D: de::Deserializer<'de>,
1194 {
1195 match Bson::deserialize(deserializer)? {
1196 Bson::Decimal128(d128) => Ok(d128),
1197 o => Err(serde::de::Error::custom(format!(
1198 "expecting Decimal128, got {:?}",
1199 o
1200 ))),
1201 }
1202 }
1203}
1204
1205impl<'de> Deserialize<'de> for DateTime {
1206 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1207 where
1208 D: de::Deserializer<'de>,
1209 {
1210 match Bson::deserialize(deserializer)? {
1211 Bson::DateTime(dt) => Ok(dt),
1212 _ => Err(serde::de::Error::custom("expecting DateTime")),
1213 }
1214 }
1215}
1216
1217impl<'de> Deserialize<'de> for DbPointer {
1218 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
1219 where
1220 D: de::Deserializer<'de>,
1221 {
1222 match Bson::deserialize(deserializer)? {
1223 Bson::DbPointer(db_pointer) => Ok(db_pointer),
1224 _ => Err(serde::de::Error::custom("expecting DbPointer")),
1225 }
1226 }
1227}