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