Skip to main content

proxmox_api/types/
unsigned_integer.rs

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