• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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