byte_unit/bit/adjusted/
serde_traits.rs1use 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 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}