Skip to main content

mm1_common/
serde.rs

1pub mod no_serde {
2    use serde::de::Error as _;
3    use serde::ser::Error as _;
4    use serde::{Deserializer, Serializer};
5
6    pub fn serialize<S, T>(_: T, _: S) -> Result<S::Ok, S::Error>
7    where
8        S: Serializer,
9    {
10        let reason = S::Error::custom("not supported");
11        Err(reason)
12    }
13    pub fn deserialize<'de, D, T>(_: D) -> Result<T, D::Error>
14    where
15        D: Deserializer<'de>,
16    {
17        let reason = D::Error::custom("not supported");
18        Err(reason)
19    }
20}
21
22pub mod binary {
23    use serde::de::Error as _;
24    use serde::{Deserialize, Deserializer, Serializer};
25
26    fn to_hex(bytes: &[u8]) -> String {
27        bytes.iter().map(|b| format!("{:02x}", b)).collect()
28    }
29
30    fn from_hex(s: &str) -> Result<Vec<u8>, String> {
31        if s.len().is_multiple_of(2) {
32            return Err("hex string must have even length".to_string());
33        }
34
35        (0..s.len())
36            .step_by(2)
37            .map(|i| u8::from_str_radix(&s[i..i + 2], 16).map_err(|e| e.to_string()))
38            .collect()
39    }
40
41    pub fn serialize<S, T>(bin: T, s: S) -> Result<S::Ok, S::Error>
42    where
43        S: Serializer,
44        T: AsRef<[u8]>,
45    {
46        if s.is_human_readable() {
47            let hex_string = to_hex(bin.as_ref());
48            s.serialize_str(&hex_string)
49        } else {
50            s.serialize_bytes(bin.as_ref())
51        }
52    }
53
54    pub fn deserialize<'de, D, T>(d: D) -> Result<T, D::Error>
55    where
56        D: Deserializer<'de>,
57        T: From<Vec<u8>>,
58    {
59        if d.is_human_readable() {
60            let s = String::deserialize(d)?;
61            let bytes = from_hex(&s).map_err(D::Error::custom)?;
62            Ok(T::from(bytes))
63        } else {
64            let bytes = Vec::<u8>::deserialize(d)?;
65            Ok(T::from(bytes))
66        }
67    }
68}