use std::{fmt::Debug, io, pin::Pin, sync::Arc};
use bincode::{
config::{
RejectTrailing, VarintEncoding, WithOtherEndian, WithOtherIntEncoding, WithOtherLimit,
WithOtherTrailing,
},
Options,
};
use bytes::{Bytes, BytesMut};
use serde::{Deserialize, Serialize};
use tokio_serde::{Deserializer, Serializer};
use super::Message;
#[allow(clippy::type_complexity)]
pub struct BincodeFormat(
)`.
pub(crate) WithOtherTrailing<
WithOtherIntEncoding<
WithOtherEndian<
WithOtherLimit<bincode::DefaultOptions, bincode::config::Infinite>,
bincode::config::LittleEndian,
>,
VarintEncoding,
>,
RejectTrailing,
>,
);
impl BincodeFormat {
#[inline]
pub(crate) fn serialize_arbitrary<T>(&self, item: &T) -> io::Result<Vec<u8>>
where
T: Serialize,
{
self.0
.serialize(item)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))
}
}
impl Debug for BincodeFormat {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("BincodeFormat")
}
}
impl Default for BincodeFormat {
fn default() -> Self {
let opts = bincode::options()
.with_no_limit() .with_little_endian() .with_varint_encoding() .reject_trailing_bytes(); BincodeFormat(opts)
}
}
impl<P> Serializer<Arc<Message<P>>> for BincodeFormat
where
Message<P>: Serialize,
{
type Error = io::Error;
#[inline]
fn serialize(self: Pin<&mut Self>, item: &Arc<Message<P>>) -> Result<Bytes, Self::Error> {
let msg = &**item;
self.serialize_arbitrary(msg).map(Into::into)
}
}
impl<P> Deserializer<Message<P>> for BincodeFormat
where
for<'de> Message<P>: Deserialize<'de>,
{
type Error = io::Error;
#[inline]
fn deserialize(self: Pin<&mut Self>, src: &BytesMut) -> Result<Message<P>, Self::Error> {
self.0
.deserialize(src)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidData, err))
}
}