use bincode::Options;
use serde::{Deserialize, Serialize};
#[inline(always)]
pub(crate) fn serialize_into<T: Serialize>(
value: &T,
buf: &mut Vec<u8>,
) -> Result<(), SerializeError> {
bincode_opts().serialize_into(buf, value).map_err(Into::into)
}
#[inline(always)]
pub(crate) fn deserialize<'de, T: Deserialize<'de>>(
buf: &'de [u8],
) -> Result<T, DeserializeError> {
bincode_opts().deserialize(buf).map_err(Into::into)
}
#[inline(always)]
fn bincode_opts() -> impl bincode::Options {
bincode::DefaultOptions::new().with_varint_encoding()
}
pub struct SerializeError {
inner: bincode::Error,
}
impl core::fmt::Debug for SerializeError {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.inner.fmt(f)
}
}
impl core::fmt::Display for SerializeError {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.inner.fmt(f)
}
}
impl std::error::Error for SerializeError {}
impl From<bincode::Error> for SerializeError {
#[inline]
fn from(inner: bincode::Error) -> Self {
Self { inner }
}
}
pub struct DeserializeError {
inner: bincode::Error,
}
impl core::fmt::Debug for DeserializeError {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.inner.fmt(f)
}
}
impl core::fmt::Display for DeserializeError {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
self.inner.fmt(f)
}
}
impl std::error::Error for DeserializeError {}
impl From<bincode::Error> for DeserializeError {
#[inline]
fn from(inner: bincode::Error) -> Self {
Self { inner }
}
}