use crate::{DeserializeError, Serialize};
pub trait Codec: Encoder + Decoder {}
impl<E, D> Codec for (E, D)
where
E: Encoder,
D: Decoder,
{
}
impl<E, D> Encoder for (E, D)
where
E: Encoder,
D: Decoder,
{
type Message = E::Message;
type Serialized = E::Serialized;
fn encode(&mut self, message: Self::Message) -> Self::Serialized {
self.0.encode(message)
}
fn return_buffer(&mut self, buffer: Self::Serialized) {
self.0.return_buffer(buffer);
}
}
impl<E, D> Decoder for (E, D)
where
E: Encoder,
D: Decoder,
{
type Message = D::Message;
fn decode(
&mut self,
buffer: impl bytes::Buf,
) -> std::result::Result<(usize, Self::Message), DeserializeError> {
self.1.decode(buffer)
}
}
pub trait Encoder {
type Message;
type Serialized: bytes::Buf;
fn encode(&mut self, message: Self::Message) -> Self::Serialized;
fn return_buffer(&mut self, _buffer: Self::Serialized) {
}
}
pub trait Decoder {
type Message;
fn decode(
&mut self,
buffer: impl bytes::Buf,
) -> std::result::Result<(usize, Self::Message), DeserializeError>;
}
impl<T> Encoder for T
where
T: Serialize,
{
type Message = T::Message;
type Serialized = OwnedBuffer;
#[cfg_attr(
feature = "tracing",
tracing::instrument(skip_all, name = "raw_serialize")
)]
fn encode(&mut self, message: Self::Message) -> Self::Serialized {
let mut buffer = Vec::new();
self.serialize_into_buffer(message, &mut buffer);
OwnedBuffer::new(buffer)
}
}
pub struct OwnedBuffer {
buffer: Vec<u8>,
cursor: usize,
}
impl OwnedBuffer {
fn new(buffer: Vec<u8>) -> Self {
Self { buffer, cursor: 0 }
}
}
impl bytes::Buf for OwnedBuffer {
#[inline(always)]
fn remaining(&self) -> usize {
self.buffer.len() - self.cursor
}
#[inline(always)]
fn chunk(&self) -> &[u8] {
&self.buffer[self.cursor..]
}
#[inline(always)]
fn advance(&mut self, cnt: usize) {
assert!(
self.cursor + cnt <= self.buffer.len(),
"can't advance past the end of the buffer"
);
self.cursor += cnt;
}
}