use base64::{Engine, engine::general_purpose::STANDARD};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn serialize<S: Serializer>(bytes: &bytes::Bytes, s: S) -> Result<S::Ok, S::Error> {
STANDARD.encode(bytes.as_ref()).serialize(s)
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<bytes::Bytes, D::Error> {
let s = String::deserialize(d)?;
STANDARD
.decode(&s)
.map(bytes::Bytes::from)
.map_err(serde::de::Error::custom)
}
pub mod option {
use super::{Deserialize, Deserializer, Engine, STANDARD, Serialize, Serializer};
pub fn serialize<S: Serializer>(bytes: &Option<bytes::Bytes>, s: S) -> Result<S::Ok, S::Error> {
match bytes {
Some(b) => STANDARD.encode(b.as_ref()).serialize(s),
None => s.serialize_none(),
}
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<bytes::Bytes>, D::Error> {
let opt: Option<String> = Option::deserialize(d)?;
match opt {
Some(s) => STANDARD
.decode(&s)
.map(|v| Some(bytes::Bytes::from(v)))
.map_err(serde::de::Error::custom),
None => Ok(None),
}
}
}