pub mod compression;
pub mod decode;
pub mod encode;
use std::{io, marker::PhantomData, mem::size_of};
use bytes::Bytes;
use pilota::{LinkedBytes, pb::Message};
use crate::{Status, status::Code::Internal};
const PREFIX_LEN: usize = size_of::<u32>() + size_of::<u8>();
const BUFFER_SIZE: usize = 8 * 1024;
pub trait Encoder {
type Item;
type Error: From<io::Error>;
fn encode(&mut self, item: Self::Item, dst: &mut LinkedBytes) -> Result<(), Self::Error>;
}
#[derive(Debug, Clone)]
pub struct DefaultEncoder<T>(PhantomData<T>);
impl<T: Message> Encoder for DefaultEncoder<T> {
type Item = T;
type Error = Status;
fn encode(&mut self, item: Self::Item, dst: &mut LinkedBytes) -> Result<(), Self::Error> {
let mut ctx = pilota::pb::EncodeLengthContext::default();
let required_len = item.encoded_len(&mut ctx) - ctx.zero_copy_len;
dst.reserve(required_len);
item.encode(dst)
.map_err(|e| Status::new(Internal, e.to_string()))
}
}
impl<T> Default for DefaultEncoder<T> {
fn default() -> Self {
DefaultEncoder(PhantomData)
}
}
pub trait Decoder {
type Item;
type Error: From<io::Error>;
fn decode(&mut self, src: Bytes) -> Result<Option<Self::Item>, Self::Error>;
}
#[derive(Debug, Clone)]
pub struct DefaultDecoder<T>(PhantomData<fn(T)>);
impl<T: Message + Default> Decoder for DefaultDecoder<T> {
type Item = T;
type Error = Status;
fn decode(&mut self, src: Bytes) -> Result<Option<Self::Item>, Self::Error> {
Message::decode(src)
.map(Some)
.map_err(|e| Status::new(Internal, e.to_string()))
}
}
impl<T> Default for DefaultDecoder<T> {
fn default() -> Self {
DefaultDecoder(PhantomData)
}
}