pub mod endian;
pub mod error;
pub type Result<T> = std::result::Result<T, crate::error::Error>;
pub trait Sender {
fn snd_all(&mut self, buf: &[u8]) -> Result<()>;
}
pub trait Receiver {
fn rcv_all(&mut self, buf: &mut [u8]) -> Result<()>;
}
pub trait Sendable {
fn snd_to<S>(&self, writer: &mut S) -> Result<()>
where
S: Sender;
}
pub trait Receivable: Sized {
fn rcv_from<R>(reader: &mut R) -> Result<Self>
where
R: Receiver;
}
pub trait Snd {
fn snd<T>(&mut self, v: T) -> Result<()>
where
T: Sendable;
}
pub trait Rcv {
fn rcv<T>(&mut self) -> Result<T>
where
T: Receivable;
fn rcv_bytes(&mut self, len: usize) -> Result<Vec<u8>>;
}
pub trait FromReader: Sized {
fn from_reader<R: Receiver>(reader: &mut R, len: usize) -> Result<Self>;
}
pub trait IntoWriter {
#[allow(clippy::wrong_self_convention)]
fn into_writer<S: Sender>(&self, writer: &mut S, len: usize) -> Result<()>;
}
impl<S: Sender> Snd for S {
#[inline]
fn snd<T: Sendable>(&mut self, v: T) -> Result<()> {
v.snd_to(self)
}
}
impl<R> Rcv for R
where
R: Receiver,
{
#[inline]
fn rcv<T>(&mut self) -> Result<T>
where
T: Receivable,
{
T::rcv_from(self)
}
#[inline]
#[allow(clippy::uninit_vec)]
fn rcv_bytes(&mut self, len: usize) -> Result<Vec<u8>> {
let mut vec = Vec::with_capacity(len);
unsafe {
vec.set_len(len);
}
self.rcv_all(&mut vec)?;
Ok(vec)
}
}
impl<W: std::io::Write> Sender for W
{
#[inline]
fn snd_all(&mut self, buf: &[u8]) -> Result<()> {
self.write_all(buf).map_err(crate::error::Error::Io)
}
}
impl<R: std::io::Read> Receiver for R
{
#[inline]
fn rcv_all(&mut self, buf: &mut [u8]) -> Result<()> {
self.read_exact(buf).map_err(crate::error::Error::Io)
}
}