tendermint_proto/serializers/
bytes.rs1pub mod hexstring {
5    use serde::{Deserialize, Deserializer, Serializer};
6    use subtle_encoding::hex;
7
8    use crate::prelude::*;
9    use crate::serializers::cow_str::CowStr;
10
11    pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
13    where
14        D: Deserializer<'de>,
15        T: From<Vec<u8>>,
16    {
17        let string = Option::<CowStr<'_>>::deserialize(deserializer)?.unwrap_or_default();
18        hex::decode_upper(&string)
19            .or_else(|_| hex::decode(&string))
20            .map(Into::into)
21            .map_err(serde::de::Error::custom)
22    }
23
24    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
26    where
27        S: Serializer,
28        T: AsRef<[u8]>,
29    {
30        let hex_bytes = hex::encode_upper(value.as_ref());
31        let hex_string = String::from_utf8(hex_bytes).map_err(serde::ser::Error::custom)?;
32        serializer.serialize_str(&hex_string)
33    }
34}
35
36pub mod base64string {
38    use serde::{Deserialize, Deserializer, Serializer};
39    use subtle_encoding::base64;
40
41    use crate::prelude::*;
42    use crate::serializers::cow_str::CowStr;
43
44    pub fn deserialize<'de, D, T>(deserializer: D) -> Result<T, D::Error>
46    where
47        D: Deserializer<'de>,
48        Vec<u8>: Into<T>,
49    {
50        let s = Option::<CowStr<'_>>::deserialize(deserializer)?.unwrap_or_default();
51        let v = base64::decode(s).map_err(serde::de::Error::custom)?;
52        Ok(v.into())
53    }
54
55    pub fn deserialize_to_string<'de, D>(deserializer: D) -> Result<String, D::Error>
57    where
58        D: Deserializer<'de>,
59    {
60        let s = Option::<CowStr<'_>>::deserialize(deserializer)?.unwrap_or_default();
61        String::from_utf8(base64::decode(s).map_err(serde::de::Error::custom)?)
62            .map_err(serde::de::Error::custom)
63    }
64
65    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
67    where
68        S: Serializer,
69        T: AsRef<[u8]>,
70    {
71        let base64_bytes = base64::encode(value.as_ref());
72        let base64_string = String::from_utf8(base64_bytes).map_err(serde::ser::Error::custom)?;
73        serializer.serialize_str(&base64_string)
74    }
75}
76
77pub mod vec_base64string {
79    use serde::{Deserialize, Deserializer, Serializer};
80    use subtle_encoding::base64;
81
82    use crate::prelude::*;
83    use crate::serializers::cow_str::CowStr;
84
85    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<Vec<u8>>, D::Error>
87    where
88        D: Deserializer<'de>,
89    {
90        Option::<Vec<CowStr<'_>>>::deserialize(deserializer)?
91            .unwrap_or_default()
92            .into_iter()
93            .map(|s| base64::decode(s).map_err(serde::de::Error::custom))
94            .collect()
95    }
96
97    pub fn serialize<S, T>(value: &[T], serializer: S) -> Result<S::Ok, S::Error>
99    where
100        S: Serializer,
101        T: AsRef<[u8]>,
102    {
103        let base64_strings = value
104            .iter()
105            .map(|v| {
106                String::from_utf8(base64::encode(v.as_ref())).map_err(serde::ser::Error::custom)
107            })
108            .collect::<Result<Vec<String>, S::Error>>()?;
109        serializer.collect_seq(base64_strings)
110    }
111}
112
113pub mod option_base64string {
115    use serde::{Deserialize, Deserializer, Serializer};
116    use subtle_encoding::base64;
117
118    use crate::prelude::*;
119    use crate::serializers::cow_str::CowStr;
120
121    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
123    where
124        D: Deserializer<'de>,
125    {
126        let s = Option::<CowStr<'_>>::deserialize(deserializer)?.unwrap_or_default();
127        base64::decode(s).map_err(serde::de::Error::custom)
128    }
129
130    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
132    where
133        S: Serializer,
134        T: AsRef<[u8]>,
135    {
136        let base64_bytes = base64::encode(value.as_ref());
137        let base64_string = String::from_utf8(base64_bytes).map_err(serde::ser::Error::custom)?;
138        serializer.serialize_str(&base64_string)
139    }
140}
141
142pub mod string {
144    use serde::{Deserialize, Deserializer, Serializer};
145
146    use crate::prelude::*;
147    use crate::serializers::cow_str::CowStr;
148
149    #[allow(dead_code)]
151    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
152    where
153        D: Deserializer<'de>,
154    {
155        let string = Option::<CowStr<'_>>::deserialize(deserializer)?.unwrap_or_default();
156        Ok(string.as_bytes().to_vec())
157    }
158
159    #[allow(dead_code)]
161    pub fn serialize<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
162    where
163        S: Serializer,
164        T: AsRef<[u8]>,
165    {
166        let string =
167            String::from_utf8(value.as_ref().to_vec()).map_err(serde::ser::Error::custom)?;
168        serializer.serialize_str(&string)
169    }
170}