1 use serde::de::{
2 Deserialize, Deserializer, EnumAccess, IgnoredAny, MapAccess, VariantAccess, Visitor,
3 };
4 use serde_json::json;
5 use std::fmt;
6
7 #[derive(Debug)]
8 pub enum Enum {
9 Variant { x: u8 },
10 }
11
12 impl<'de> Deserialize<'de> for Enum {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,13 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14 where
15 D: Deserializer<'de>,
16 {
17 struct EnumVisitor;
18
19 impl<'de> Visitor<'de> for EnumVisitor {
20 type Value = Enum;
21
22 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
23 formatter.write_str("enum Enum")
24 }
25
26 fn visit_enum<A>(self, data: A) -> Result<Self::Value, A::Error>
27 where
28 A: EnumAccess<'de>,
29 {
30 let (IgnoredAny, variant) = data.variant()?;
31 variant.struct_variant(&["x"], self)
32 }
33
34 fn visit_map<A>(self, mut data: A) -> Result<Self::Value, A::Error>
35 where
36 A: MapAccess<'de>,
37 {
38 let mut x = 0;
39 if let Some((IgnoredAny, value)) = data.next_entry()? {
40 x = value;
41 }
42 Ok(Enum::Variant { x })
43 }
44 }
45
46 deserializer.deserialize_enum("Enum", &["Variant"], EnumVisitor)
47 }
48 }
49
50 #[test]
test()51 fn test() {
52 let s = r#" {"Variant":{"x":0,"y":0}} "#;
53 assert!(serde_json::from_str::<Enum>(s).is_err());
54
55 let j = json!({"Variant":{"x":0,"y":0}});
56 assert!(serde_json::from_value::<Enum>(j).is_err());
57 }
58