vbsp_common/
bool.rs

1use serde::de::{Error, Unexpected};
2use serde::Deserializer;
3use std::fmt;
4
5struct BoolVisitor;
6impl serde::de::Visitor<'_> for BoolVisitor {
7    type Value = bool;
8
9    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
10        write!(formatter, "bool value")
11    }
12
13    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
14    where
15        E: Error,
16    {
17        match v {
18            0 => Ok(false),
19            1 => Ok(true),
20            _ => Err(E::invalid_value(Unexpected::Signed(v), &"0 or 1")),
21        }
22    }
23
24    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
25    where
26        E: Error,
27    {
28        match v {
29            "0" | "no" => Ok(false),
30            "1" | "yes" => Ok(true),
31            other => Err(E::invalid_value(Unexpected::Str(other), &"bool")),
32        }
33    }
34}
35
36pub fn deserialize_bool<'de, D: Deserializer<'de>>(deserializer: D) -> Result<bool, D::Error> {
37    deserializer.deserialize_any(BoolVisitor)
38}