1use serde::de::{Error, Unexpected};
2use serde::{Deserialize, Deserializer};
3use std::fmt;
4use std::str::FromStr;
5
6#[derive(Debug, Clone)]
7pub enum Negated {
8 Yes,
9 No,
10 MatchingCriteria,
11}
12pub struct NegatedParseErr;
13impl FromStr for Negated {
14 type Err = NegatedParseErr;
15
16 fn from_str(s: &str) -> Result<Self, Self::Err> {
17 match s {
18 "1" => Ok(Negated::Yes),
19 "0" => Ok(Negated::No),
20 "allow entities that match criteria" => Ok(Negated::MatchingCriteria),
21 _ => Err(NegatedParseErr),
22 }
23 }
24}
25
26struct NegatedVisitor;
27impl serde::de::Visitor<'_> for NegatedVisitor {
28 type Value = Negated;
29
30 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
31 write!(formatter, "Negated value")
32 }
33
34 fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
35 where
36 E: Error,
37 {
38 match v {
39 0 => Ok(Negated::No),
40 1 => Ok(Negated::Yes),
41 _ => Err(E::invalid_value(Unexpected::Signed(v), &"0 or 1")),
42 }
43 }
44
45 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
46 where
47 E: Error,
48 {
49 v.parse()
50 .map_err(|_| E::invalid_value(Unexpected::Str(v), &"Negated"))
51 }
52}
53
54impl<'de> Deserialize<'de> for Negated {
55 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
56 where
57 D: Deserializer<'de>,
58 {
59 deserializer.deserialize_any(NegatedVisitor)
60 }
61}