proxmox_api/types/
number.rs

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