proxmox_api/types/
number.rs1use 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 number or string encoding a number")
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 Ok(v as f64)
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::<f64>() {
49 Ok(value)
50 } else {
51 Err(E::custom("invalid value for boolean"))
52 }
53 }
54 }
55
56 d.deserialize_any(Visitor)
57}
58
59pub fn serialize_number<S>(value: &f64, s: S) -> Result<S::Ok, S::Error>
60where
61 S: Serializer,
62{
63 s.serialize_f64(*value)
64}
65
66pub fn deserialize_number_optional<'de, D>(d: D) -> Result<Option<f64>, D::Error>
67where
68 D: Deserializer<'de>,
69{
70 Ok(Option::<Number>::deserialize(d)?.map(|v| v.get()))
71}
72
73pub fn serialize_number_optional<S>(value: &Option<f64>, s: S) -> Result<S::Ok, S::Error>
74where
75 S: Serializer,
76{
77 value.map(Number).serialize(s)
78}