bson/de/
serde.rs

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    /// Deserialize this value given this [`Deserializer`].
107    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
591/// Deserializer for deserializing a [`Bson`] value.
592pub struct Deserializer {
593    value: Option<Bson>,
594    options: DeserializerOptions,
595}
596
597/// Options used to configure a [`Deserializer`].
598#[derive(Debug, Clone, Default)]
599#[non_exhaustive]
600pub(crate) struct DeserializerOptions {
601    /// Whether the [`Deserializer`] should present itself as human readable or not.
602    /// The default is true. For internal use only.
603    pub(crate) human_readable: Option<bool>,
604}
605
606impl Deserializer {
607    /// Construct a `Deserializer` with the provided [`Bson`] value.
608    pub fn new(value: Bson) -> Deserializer {
609        Deserializer::new_with_options(value, Default::default())
610    }
611
612    /// Create a new [`Deserializer`] using the provided options.
613    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        // enums are encoded in json as maps with a single key:value pair
790        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}