use base64::Engine as _;
use miniserde::de::Visitor;
use miniserde::ser::Fragment;
pub fn begin(out: &mut Option<Vec<u8>>) -> &mut dyn Visitor {
Place::new(out)
}
pub fn serialize(value: &Vec<u8>) -> Fragment<'_> {
let encoded = base64::engine::general_purpose::STANDARD.encode(value);
Fragment::Str(std::borrow::Cow::Owned(encoded))
}
#[repr(C)]
struct Place {
out: Option<Vec<u8>>,
}
impl Place {
fn new(out: &mut Option<Vec<u8>>) -> &mut Self {
unsafe { &mut *std::ptr::addr_of_mut!(*out).cast::<Place>() }
}
}
impl Visitor for Place {
fn string(&mut self, s: &str) -> miniserde::Result<()> {
let bytes = base64::engine::general_purpose::STANDARD
.decode(s)
.map_err(|_| miniserde::Error)?;
self.out = Some(bytes);
Ok(())
}
}