use base64::Engine;
use base64::prelude::BASE64_STANDARD;
use bytes::Bytes;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serializer;
pub(crate) fn serialize<S: Serializer>(bytes: &Bytes, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(&BASE64_STANDARD.encode(bytes))
}
pub(crate) fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Bytes, D::Error> {
let text = <std::borrow::Cow<'de, str>>::deserialize(deserializer)?;
decode(&text).map_err(serde::de::Error::custom)
}
pub(crate) fn decode(text: &str) -> Result<Bytes, base64::DecodeError> {
match BASE64_STANDARD.decode(text) {
Ok(bytes) => Ok(Bytes::from(bytes)),
Err(base64::DecodeError::InvalidPadding) => {
let trimmed = text.trim_end_matches('=');
base64::prelude::BASE64_STANDARD_NO_PAD
.decode(trimmed)
.map(Bytes::from)
}
Err(err) => Err(err),
}
}
pub(crate) fn encode(bytes: &[u8]) -> String {
BASE64_STANDARD.encode(bytes)
}