vbsp_common/
negated.rs

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}