Skip to content

Commit 7362bd3

Browse files
committed
RUST-1243 Handle enum keys when deserializing a map from binary (#348)
1 parent b8442a5 commit 7362bd3

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

serde-tests/test.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,29 @@ fn hashmap() {
393393
run_test(&v, &doc, "hashmap");
394394
}
395395

396+
#[test]
397+
fn hashmap_enum_key() {
398+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
399+
struct Foo {
400+
map: BTreeMap<Bar, String>,
401+
}
402+
403+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Hash, PartialOrd, Ord)]
404+
enum Bar {
405+
Baz,
406+
}
407+
408+
let obj = Foo {
409+
map: BTreeMap::from_iter([(Bar::Baz, "2".to_owned())]),
410+
};
411+
let doc = doc! {
412+
"map": {
413+
"Baz": "2",
414+
},
415+
};
416+
run_test(&obj, &doc, "hashmap_enum_key");
417+
}
418+
396419
#[test]
397420
fn tuple_struct() {
398421
#[derive(Serialize, Deserialize, PartialEq, Debug)]

src/de/raw.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,22 @@ impl<'d, 'de> serde::de::Deserializer<'de> for DocumentKeyDeserializer<'d, 'de>
642642
}
643643
}
644644

645+
fn deserialize_enum<V>(
646+
self,
647+
_name: &str,
648+
_variants: &'static [&'static str],
649+
visitor: V,
650+
) -> Result<V::Value>
651+
where
652+
V: serde::de::Visitor<'de>,
653+
{
654+
visitor.visit_enum(
655+
self.root_deserializer
656+
.deserialize_cstr()?
657+
.into_deserializer(),
658+
)
659+
}
660+
645661
fn deserialize_newtype_struct<V>(self, _name: &'static str, visitor: V) -> Result<V::Value>
646662
where
647663
V: serde::de::Visitor<'de>,
@@ -655,7 +671,7 @@ impl<'d, 'de> serde::de::Deserializer<'de> for DocumentKeyDeserializer<'d, 'de>
655671

656672
forward_to_deserialize_any! {
657673
bool char str bytes byte_buf option unit unit_struct string
658-
identifier seq tuple tuple_struct struct map enum
674+
identifier seq tuple tuple_struct struct map
659675
ignored_any i8 i16 i32 i64 u8 u16 u32 u64 f32 f64
660676
}
661677
}

0 commit comments

Comments
 (0)