starknet_core/serde/
byte_array.rs

1/// Serializing and deserializing [`Vec<u8>`] with base64 encoding.
2pub mod base64 {
3    use alloc::{fmt::Formatter, format, vec::*};
4
5    use base64::{engine::general_purpose::STANDARD, Engine};
6    use serde::{de::Visitor, Deserializer, Serializer};
7
8    struct Base64Visitor;
9
10    /// Serializes [`Vec<u8>`] as base64 string.
11    pub fn serialize<S, T>(value: T, serializer: S) -> Result<S::Ok, S::Error>
12    where
13        S: Serializer,
14        T: AsRef<Vec<u8>>,
15    {
16        serializer.serialize_str(&STANDARD.encode(value.as_ref()))
17    }
18
19    /// Deserializes [`Vec<u8>`] from base64 string.
20    pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
21    where
22        D: Deserializer<'de>,
23    {
24        deserializer.deserialize_any(Base64Visitor)
25    }
26
27    impl Visitor<'_> for Base64Visitor {
28        type Value = Vec<u8>;
29
30        fn expecting(&self, formatter: &mut Formatter<'_>) -> alloc::fmt::Result {
31            write!(formatter, "string")
32        }
33
34        fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
35        where
36            E: serde::de::Error,
37        {
38            STANDARD
39                .decode(v)
40                .map_err(|err| serde::de::Error::custom(format!("invalid base64 string: {err}")))
41        }
42    }
43}