proxmox_api/types/
bool.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2
3#[derive(Debug, Deserialize, Serialize)]
4pub struct Bool(
5    #[serde(
6        serialize_with = "serialize_bool",
7        deserialize_with = "deserialize_bool"
8    )]
9    pub bool,
10);
11
12impl Bool {
13    pub fn get(&self) -> bool {
14        self.0
15    }
16}
17
18pub fn deserialize_bool<'de, D>(d: D) -> Result<bool, D::Error>
19where
20    D: Deserializer<'de>,
21{
22    struct Visitor;
23
24    impl<'v> serde::de::Visitor<'v> for Visitor {
25        type Value = bool;
26
27        fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
28            write!(f, "A string or number encoded bool")
29        }
30
31        fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
32        where
33            E: serde::de::Error,
34        {
35            if v == 0 {
36                Ok(false)
37            } else if v == 1 {
38                Ok(true)
39            } else {
40                Err(E::custom("Invalid value for boolean"))
41            }
42        }
43
44        fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
45        where
46            E: serde::de::Error,
47        {
48            if let Ok(value) = v.parse::<u64>() {
49                if value == 0 {
50                    Ok(false)
51                } else if value == 1 {
52                    Ok(true)
53                } else {
54                    Err(E::custom("invalid value for boolean"))
55                }
56            } else {
57                Err(E::custom("invalid value for boolean"))
58            }
59        }
60    }
61
62    d.deserialize_any(Visitor)
63}
64
65pub fn serialize_bool<S>(value: &bool, s: S) -> Result<S::Ok, S::Error>
66where
67    S: Serializer,
68{
69    let value = if !value { 0u32 } else { 1u32 };
70    s.serialize_u32(value)
71}
72
73pub fn deserialize_bool_optional<'de, D>(d: D) -> Result<Option<bool>, D::Error>
74where
75    D: Deserializer<'de>,
76{
77    Ok(Option::<Bool>::deserialize(d)?.map(|v| v.get()))
78}
79
80pub fn serialize_bool_optional<S>(value: &Option<bool>, s: S) -> Result<S::Ok, S::Error>
81where
82    S: Serializer,
83{
84    value.map(Bool).serialize(s)
85}