prpc/
serde_helpers.rs

1pub use prpc_serde_bytes::prpc_serde_bytes;
2
3pub mod bytes_as_hex_str {
4    use alloc::string::String;
5    use alloc::vec::Vec;
6    use serde::{Deserialize, Serialize};
7
8    pub fn serialize<S>(bytes: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
9    where
10        S: serde::Serializer,
11    {
12        hex::encode(bytes).serialize(serializer)
13    }
14
15    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
16    where
17        D: serde::Deserializer<'de>,
18    {
19        let hex_str = String::deserialize(deserializer)?;
20        let hex_str = hex_str.trim_start_matches("0x");
21        hex::decode(hex_str).map_err(serde::de::Error::custom)
22    }
23}
24
25pub mod vec_bytes_as_hex_str {
26    use alloc::string::String;
27    use alloc::vec::Vec;
28    use serde::{Deserialize, Serialize};
29
30    #[allow(clippy::ptr_arg)]
31    pub fn serialize<S>(bytes: &Vec<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: serde::Serializer,
34    {
35        let hex_strs: Vec<String> = bytes.iter().map(|bytes| hex::encode(bytes)).collect();
36        hex_strs.serialize(serializer)
37    }
38
39    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error>
40    where
41        D: serde::Deserializer<'de>,
42    {
43        let hex_strs: Vec<String> = Vec::deserialize(deserializer)?;
44        hex_strs
45            .into_iter()
46            .map(|hex_str| {
47                let hex_str = hex_str.trim_start_matches("0x");
48                hex::decode(hex_str).map_err(serde::de::Error::custom)
49            })
50            .collect()
51    }
52}
53
54pub mod option_bytes_as_hex_str {
55    use alloc::string::String;
56    use alloc::vec::Vec;
57    use serde::{Deserialize, Serialize};
58
59    pub fn serialize<S>(bytes: &Option<Vec<u8>>, serializer: S) -> Result<S::Ok, S::Error>
60    where
61        S: serde::Serializer,
62    {
63        match bytes {
64            Some(bytes) => hex::encode(bytes).serialize(serializer),
65            None => serializer.serialize_none(),
66        }
67    }
68
69    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Vec<u8>>, D::Error>
70    where
71        D: serde::Deserializer<'de>,
72    {
73        let hex_str: Option<String> = Option::deserialize(deserializer)?;
74        match hex_str {
75            Some(hex_str) => {
76                let hex_str = hex_str.trim_start_matches("0x");
77                hex::decode(hex_str)
78                    .map(Some)
79                    .map_err(serde::de::Error::custom)
80            }
81            None => Ok(None),
82        }
83    }
84}