proxmox_api/types/
integer.rs1use 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 u64,
6);
7
8impl Integer {
9 pub fn get(&self) -> u64 {
10 self.0
11 }
12}
13
14pub fn deserialize_int<'de, D>(d: D) -> Result<u64, D::Error>
15where
16 D: Deserializer<'de>,
17{
18 struct Visitor;
19
20 impl<'v> serde::de::Visitor<'v> for Visitor {
21 type Value = u64;
22
23 fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
24 write!(f, "A string or number encoded bool")
25 }
26
27 fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
28 where
29 E: serde::de::Error,
30 {
31 if let Ok(v) = u64::try_from(v) {
32 Ok(v)
33 } else {
34 Err(E::custom("Value out of range."))
35 }
36 }
37
38 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
39 where
40 E: serde::de::Error,
41 {
42 if let Ok(value) = v.parse::<u64>() {
43 Ok(value)
44 } else {
45 Err(E::custom("invalid value for boolean"))
46 }
47 }
48 }
49
50 d.deserialize_any(Visitor)
51}
52
53pub fn serialize_int<S>(value: &u64, s: S) -> Result<S::Ok, S::Error>
54where
55 S: Serializer,
56{
57 s.serialize_u64(*value)
58}
59
60pub fn deserialize_int_optional<'de, D>(d: D) -> Result<Option<u64>, D::Error>
61where
62 D: Deserializer<'de>,
63{
64 let v = Option::<Integer>::deserialize(d);
65 Ok(v?.map(|v| v.get()))
66}
67
68pub fn serialize_int_optional<S>(value: &Option<u64>, s: S) -> Result<S::Ok, S::Error>
69where
70 S: Serializer,
71{
72 value.map(Integer).serialize(s)
73}