perde_core/decode/
enums.rs1use 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}