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 From<Vec<u8>> for Base64Bytes {
25    fn from(value: Vec<u8>) -> Self {
26        Self { bytes: value }
27    }
28}
29
30impl Serialize for Base64Bytes {
31    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: serde::Serializer,
34    {
35        let encoded = base64::engine::general_purpose::STANDARD.encode(&self.bytes);
36        serializer.serialize_str(&encoded)
37    }
38}
39
40impl<'de> Deserialize<'de> for Base64Bytes {
41    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
42    where
43        D: serde::Deserializer<'de>,
44    {
45        let s: &str = Deserialize::deserialize(deserializer)?;
46        let decoded = base64::engine::general_purpose::STANDARD
47            .decode(s)
48            .map_err(serde::de::Error::custom)?;
49        Ok(Base64Bytes { bytes: decoded })
50    }
51}