1use data_encoding::BASE64;
2use serde::de::Error;
3use serde::de::Visitor;
4use serde::{Deserialize, Deserializer, Serializer};
5use std::convert::TryInto;
6
7pub struct SignatureVisitor;
8
9impl<'de> Visitor<'de> for SignatureVisitor {
10 type Value = [u8; 64];
11
12 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
13 formatter.write_str("a 64 byte array")
14 }
15
16 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
17 where
18 E: serde::de::Error,
19 {
20 if v.len() == 64 {
21 let mut bytes = [0; 64];
22 bytes.copy_from_slice(v);
23 Ok(bytes)
24 } else {
25 Err(E::custom(format!("Invalid signature length: {}", v.len())))
26 }
27 }
28}
29
30pub struct U8_32Visitor;
31
32impl<'de> Visitor<'de> for U8_32Visitor {
33 type Value = [u8; 32];
34
35 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
36 formatter.write_str("a 32 byte array")
37 }
38
39 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
40 where
41 E: serde::de::Error,
42 {
43 if v.len() == 32 {
44 let mut bytes = [0; 32];
45 bytes.copy_from_slice(v);
46 Ok(bytes)
47 } else {
48 Err(E::custom(format!("Invalid byte array length: {}", v.len())))
49 }
50 }
51}
52
53pub fn deserialize_bytes32<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error>
54where
55 D: Deserializer<'de>,
56{
57 let s = <&str>::deserialize(deserializer)?;
58 let mut decoded = [0; 32];
59 decoded.copy_from_slice(&BASE64.decode(s.as_bytes()).unwrap());
60 Ok(decoded)
61}
62
63pub fn deserialize_bytes64<'de, D>(deserializer: D) -> Result<[u8; 64], D::Error>
64where
65 D: Deserializer<'de>,
66{
67 let s = <&str>::deserialize(deserializer)?;
68 let mut decoded = [0; 64];
69 let bytes = BASE64.decode(s.as_bytes()).map_err(D::Error::custom)?;
70 decoded.copy_from_slice(&bytes);
71 Ok(decoded)
72}
73
74pub fn deserialize_bytes<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
75where
76 D: Deserializer<'de>,
77{
78 let s = <&str>::deserialize(deserializer)?;
79 Ok(BASE64.decode(s.as_bytes()).unwrap())
80}
81
82pub fn serialize_bytes<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
83where
84 S: Serializer,
85{
86 serializer.serialize_str(&BASE64.encode(bytes))
87}
88
89pub fn decode_base64(bytes: &[u8]) -> Result<Vec<u8>, String> {
90 BASE64.decode(bytes).map_err(|e| e.to_string())
91}
92
93pub fn deserialize_byte32_arr<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error>
94where
95 D: Deserializer<'de>,
96{
97 let slice = <&[u8]>::deserialize(deserializer)?;
98 slice_to_byte32_arr::<D>(slice)
99}
100
101pub fn deserialize_byte32_arr_opt<'de, D>(deserializer: D) -> Result<Option<[u8; 32]>, D::Error>
102where
103 D: Deserializer<'de>,
104{
105 Ok(match <Option<&[u8]>>::deserialize(deserializer)? {
106 Some(slice) => Some(slice_to_byte32_arr::<D>(slice)?),
107 None => None,
108 })
109}
110
111fn slice_to_byte32_arr<'de, D>(slice: &[u8]) -> Result<[u8; 32], D::Error>
112where
113 D: Deserializer<'de>,
114{
115 slice.try_into().map_err(D::Error::custom)
116}