use std::io::{Read, Write};
pub trait Pipe: Sized {
type Reader: PipeRead<Self>;
type Writer: PipeWrite<Self>;
fn reader(self, inner: Box<dyn Read>) -> Self::Reader {
Self::Reader::new(self, inner)
}
fn writer(self, inner: Box<dyn Write>) -> Self::Writer {
Self::Writer::new(self, inner)
}
fn pipe(&mut self, input: &[u8]) -> (usize, Option<Vec<u8>>);
#[inline(always)]
fn pipe_transparent(&self, input: &[u8]) -> (usize, Option<Vec<u8>>) {
(input.len(), Some(input.to_vec()))
}
}
pub trait PipeRead<P>: Read
where
P: Pipe,
{
fn new(pipe: P, inner: Box<dyn Read>) -> Self;
}
pub trait PipeWrite<P>: Write
where
P: Pipe,
{
fn new(pipe: P, inner: Box<dyn Write>) -> Self;
}
pub trait PipeLen {
fn len_in(&self) -> usize;
fn len_out(&self) -> usize;
}
pub trait ReadLen: Read + PipeLen + Send {}
pub trait WriteLen: Write + PipeLen + Send {}