use std::cell::RefCell;
use crate::error::SerdeFlowError;
use rkyv::{ser::Serializer, Archive, Deserialize, Serialize};
pub type DefaultSerializer = rkyv::ser::serializers::AllocSerializer<4096>;
pub struct Encoder;
impl Encoder {
pub fn serialize<T>(value: &T) -> Result<Vec<u8>, crate::error::SerdeFlowError>
where
T: Archive + Serialize<DefaultSerializer>,
{
let mut serializer = DefaultSerializer::default();
let _ = serializer
.serialize_value(value)
.map_err(|_| SerdeFlowError::EncodingFailed)?;
let bytes = serializer.into_serializer().into_inner().into_vec();
Ok(bytes)
}
}
pub struct Reader<'a, T: rkyv::Archive> {
bytes: Box<[u8]>,
archived: RefCell<Option<&'a rkyv::Archived<T>>>,
}
impl<'a, T: rkyv::Archive> Reader<'a, T>
where
T: rkyv::Archive,
T::Archived: for<'b> rkyv::CheckBytes<rkyv::validation::validators::DefaultValidator<'b>>,
{
#[must_use]
pub fn new(bytes: Vec<u8>) -> Self {
Self {
bytes: bytes.into_boxed_slice(),
archived: RefCell::new(None),
}
}
pub fn deserialize(&'a self) -> Result<T, SerdeFlowError>
where
rkyv::Archived<T>: Deserialize<T, rkyv::Infallible>,
{
let archived = self.archive()?;
archived
.deserialize(&mut rkyv::Infallible)
.map_err(|_| SerdeFlowError::ParsingFailed)
}
pub fn archive(&'a self) -> Result<&'a T::Archived, SerdeFlowError> {
let borrow = self.archived.borrow();
if borrow.is_some() {
return borrow.ok_or(SerdeFlowError::Undefined);
}
drop(borrow);
let archive: &'a T::Archived = rkyv::check_archived_root::<T>(&self.bytes)
.map_err(|_| SerdeFlowError::ParsingFailed)?;
self.archived.replace(Some(archive));
let borrow = self.archived.borrow();
borrow.ok_or(SerdeFlowError::Undefined)
}
}