Skip to main content

byte_unit/bit/adjusted/
serde_traits.rs

1use core::{
2    fmt::{self, Formatter},
3    str::FromStr,
4};
5
6use serde::{
7    self, Deserialize, Deserializer, Serialize, Serializer,
8    de::{Error as DeError, Visitor},
9};
10
11use super::{AdjustedBit, Bit};
12
13impl Serialize for AdjustedBit {
14    #[inline]
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer, {
18        // Rounding can move a valid adjusted value above the supported range.
19        if self.value >= Bit::MAX.get_adjusted_unit(self.unit).get_value() {
20            return if serializer.is_human_readable() {
21                serializer.collect_str(&format_args!("{:#}", Bit::MAX))
22            } else {
23                serializer.collect_str(&format_args!("{:-#}", Bit::MAX))
24            };
25        }
26
27        if serializer.is_human_readable() {
28            serializer.collect_str(&format_args!("{:#}", self))
29        } else {
30            serializer.collect_str(&format_args!("{:-#}", self))
31        }
32    }
33}
34
35impl<'de> Deserialize<'de> for AdjustedBit {
36    #[inline]
37    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
38    where
39        D: Deserializer<'de>, {
40        struct MyVisitor;
41
42        impl<'de> Visitor<'de> for MyVisitor {
43            type Value = AdjustedBit;
44
45            #[inline]
46            fn expecting(&self, f: &mut Formatter<'_>) -> fmt::Result {
47                f.write_str("a string such as \"123\", \"123Kib\", \"50.84 Mb\"")
48            }
49
50            #[inline]
51            fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
52            where
53                E: DeError, {
54                AdjustedBit::from_str(v).map_err(DeError::custom)
55            }
56        }
57
58        deserializer.deserialize_str(MyVisitor)
59    }
60}