Skip to main content

perde_core/decode/
enums.rs

1use crate::{schema::*, types::Object};
2use serde::de::{self, DeserializeSeed, Deserializer, Visitor};
3use std::fmt;
4
5struct EnumVisitor<'a>(&'a Enum);
6
7impl<'a> EnumVisitor<'a> {
8    fn vars(&self) -> Vec<&str> {
9        self.0.variants.iter().map(|(v, _)| v.as_ref()).collect()
10    }
11
12    fn get<E>(&self, s: &str) -> Result<Object, E>
13    where
14        E: de::Error,
15    {
16        self.0
17            .variants
18            .get(s)
19            .map(|v| v.value.clone())
20            .ok_or_else(|| {
21                de::Error::custom(format!(
22                    "the enum value must be any of {:?}: got `{}`",
23                    self.vars(),
24                    s
25                ))
26            })
27    }
28}
29
30impl<'a, 'de> Visitor<'de> for EnumVisitor<'a> {
31    type Value = Object;
32
33    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
34        write!(f, "an enum value: {:?}", self.vars())
35    }
36
37    fn visit_char<E>(self, value: char) -> Result<Self::Value, E>
38    where
39        E: de::Error,
40    {
41        self.get(&value.to_string())
42    }
43
44    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
45    where
46        E: de::Error,
47    {
48        self.get(value)
49    }
50
51    fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
52    where
53        E: de::Error,
54    {
55        self.get(value)
56    }
57
58    fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
59    where
60        E: de::Error,
61    {
62        self.get(&value)
63    }
64}
65
66impl<'a, 'de> DeserializeSeed<'de> for &'a Enum {
67    type Value = Object;
68
69    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
70    where
71        D: Deserializer<'de>,
72    {
73        deserializer.deserialize_any(EnumVisitor(self))
74    }
75}