Skip to content

Commit a97fb4c

Browse files
RUST-861 Remove use of deserialize_any in ObjectId deserialization (#268)
1 parent fa22f4e commit a97fb4c

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

src/de/serde.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,19 +31,28 @@ impl<'de> Deserialize<'de> for ObjectId {
3131
where
3232
D: de::Deserializer<'de>,
3333
{
34-
deserializer
35-
.deserialize_any(BsonVisitor)
36-
.and_then(|bson| match bson {
37-
Bson::String(oid) => ObjectId::parse_str(&oid).map_err(de::Error::custom),
34+
#[derive(serde::Deserialize)]
35+
#[serde(untagged)]
36+
enum OidHelper {
37+
HexString(String),
38+
Bson(Bson),
39+
}
40+
41+
match OidHelper::deserialize(deserializer)
42+
.map_err(|_| de::Error::custom("expected ObjectId extended document or hex string"))?
43+
{
44+
OidHelper::HexString(s) => ObjectId::parse_str(&s).map_err(de::Error::custom),
45+
OidHelper::Bson(bson) => match bson {
3846
Bson::ObjectId(oid) => Ok(oid),
39-
_ => {
47+
bson => {
4048
let err = format!(
4149
"expected objectId extended document or hex string, found {}",
4250
bson
4351
);
4452
Err(de::Error::invalid_type(Unexpected::Map, &&err[..]))
4553
}
46-
})
54+
},
55+
}
4756
}
4857
}
4958

0 commit comments

Comments
 (0)