byte_unit/bit/adjusted/
serde_traits.rs

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