algonaut_encoding/
lib.rs

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}