msg_tool\utils/
serde_base64bytes.rs

1use base64::Engine;
2use serde::{Deserialize, Serialize};
3use std::ops::{Deref, DerefMut};
4
5#[derive(Clone, Debug, PartialEq, Eq)]
6pub struct Base64Bytes {
7    pub bytes: Vec<u8>,
8}
9
10impl Deref for Base64Bytes {
11    type Target = Vec<u8>;
12
13    fn deref(&self) -> &Self::Target {
14        &self.bytes
15    }
16}
17
18impl DerefMut for Base64Bytes {
19    fn deref_mut(&mut self) -> &mut Self::Target {
20        &mut self.bytes
21    }
22}
23
24impl Serialize for Base64Bytes {
25    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
26    where
27        S: serde::Serializer,
28    {
29        let encoded = base64::engine::general_purpose::STANDARD.encode(&self.bytes);
30        serializer.serialize_str(&encoded)
31    }
32}
33
34impl<'de> Deserialize<'de> for Base64Bytes {
35    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
36    where
37        D: serde::Deserializer<'de>,
38    {
39        let s: &str = Deserialize::deserialize(deserializer)?;
40        let decoded = base64::engine::general_purpose::STANDARD
41            .decode(s)
42            .map_err(serde::de::Error::custom)?;
43        Ok(Base64Bytes { bytes: decoded })
44    }
45}