Skip to main content

proxmox_api/types/
integer.rs

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