From 6cbd76e7c3c64531ce282993d925284985a973d4 Mon Sep 17 00:00:00 2001 From: Isabel Atkinson Date: Mon, 1 Apr 2024 14:32:34 -0600 Subject: [PATCH] RUST-1899 Fix UUID string deserialization --- src/de/raw.rs | 9 --------- src/de/serde.rs | 11 +++++------ src/uuid/test.rs | 21 +++++++++++++++++++++ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/de/raw.rs b/src/de/raw.rs index e338bf7d..a5f23717 100644 --- a/src/de/raw.rs +++ b/src/de/raw.rs @@ -208,15 +208,6 @@ impl<'de> Deserializer<'de> { where V: serde::de::Visitor<'de>, { - if let DeserializerHint::BinarySubtype(expected_st) = hint { - if self.current_type != ElementType::Binary { - return Err(Error::custom(format!( - "expected Binary with subtype {:?}, instead got {:?}", - expected_st, self.current_type - ))); - } - } - match self.current_type { ElementType::Int32 => visitor.visit_i32(read_i32(&mut self.bytes)?), ElementType::Int64 => visitor.visit_i64(read_i64(&mut self.bytes)?), diff --git a/src/de/serde.rs b/src/de/serde.rs index 0ab77187..06ba351e 100644 --- a/src/de/serde.rs +++ b/src/de/serde.rs @@ -637,13 +637,12 @@ impl Deserializer { let is_rawbson = matches!(hint, DeserializerHint::RawBson); - if let DeserializerHint::BinarySubtype(expected_st) = hint { - match value { - Bson::Binary(ref b) if b.subtype == expected_st => {} - ref b => { + if let DeserializerHint::BinarySubtype(expected_subtype) = hint { + if let Bson::Binary(ref binary) = value { + if binary.subtype != expected_subtype { return Err(Error::custom(format!( - "expected Binary with subtype {:?}, instead got {:?}", - expected_st, b + "expected Binary with subtype {:?}, instead got subtype {:?}", + expected_subtype, binary.subtype ))); } } diff --git a/src/uuid/test.rs b/src/uuid/test.rs index d33c02db..5118270a 100644 --- a/src/uuid/test.rs +++ b/src/uuid/test.rs @@ -1,4 +1,6 @@ use crate::{ + from_document, + from_slice, spec::BinarySubtype, uuid::{Uuid, UuidRepresentation}, Binary, @@ -269,3 +271,22 @@ fn interop_1() { let d_uuid = doc! { "uuid": uuid_uuid }; assert_eq!(d_bson, d_uuid); } + +#[test] +fn deserialize_uuid_from_string() { + #[derive(Deserialize)] + struct UuidWrapper { + uuid: Uuid, + } + + let uuid = Uuid::new(); + + let doc = doc! { "uuid": uuid.to_string() }; + let wrapper: UuidWrapper = from_document(doc).expect("failed to deserialize document"); + assert_eq!(wrapper.uuid, uuid); + + let raw_doc = rawdoc! { "uuid": uuid.to_string() }; + let wrapper: UuidWrapper = + from_slice(raw_doc.as_bytes()).expect("failed to deserialize raw document"); + assert_eq!(wrapper.uuid, uuid); +}