use rkyv::{
Archive, Deserialize, access,
api::{deserialize_using, high::HighValidator},
bytecheck::CheckBytes,
de::Pool,
rancor::Strategy,
util::AlignedVec,
};
use crate::{
context::{CacheableContext, ContextGuard},
error::{Error, Result},
};
pub type Validator<'a> = HighValidator<'a, Error>;
pub type Deserializer = Strategy<Pool, Error>;
pub fn from_bytes<T, C: CacheableContext>(bytes: &[u8], context: &C) -> Result<T>
where
T: Archive,
T::Archived: for<'a> CheckBytes<Validator<'a>> + Deserialize<T, Deserializer>,
{
let guard = ContextGuard::new(context);
let mut deserializer = Pool::default();
guard.add_to_pooling(&mut deserializer)?;
let mut aligned_vec = AlignedVec::<16>::new();
aligned_vec.extend_from_slice(bytes);
deserialize_using(
access::<T::Archived, Error>(&aligned_vec)?,
&mut deserializer,
)
}