Skip to main content

byte_unit/bit/adjusted/
serde_traits.rs

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