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}