use base64::prelude::*;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Default)]
pub struct Data(pub Vec<u8>);
impl Data {
pub fn new(data: impl Into<Vec<u8>>) -> Self {
Data(data.into())
}
}
impl<T: AsRef<[u8]>> From<T> for Data {
fn from(data: T) -> Self {
Data(data.as_ref().to_vec())
}
}
#[cfg(feature = "serde")]
impl Serialize for Data {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
let encoded = BASE64_STANDARD.encode(&self.0);
serializer.serialize_str(&encoded)
}
}
#[cfg(feature = "serde")]
impl<'de> Deserialize<'de> for Data {
fn deserialize<D>(deserializer: D) -> Result<Data, D::Error>
where
D: serde::de::Deserializer<'de>,
{
let encoded = String::deserialize(deserializer)?;
let decoded = BASE64_STANDARD.decode(encoded).map_err(serde::de::Error::custom)?;
Ok(Data(decoded))
}
}