use std::io;
mod nop;
pub use nop::Nop;
pub trait Transformer {
fn transform(&mut self, dst: &mut [u8], src: &[u8], eof: bool) -> io::Result<(usize, usize)>;
fn reset(&mut self) {}
fn chain<T: Transformer>(self, next: T) -> Chain<Self, T>
where Self: Sized
{
Chain {
first: self,
second: next,
done_first: false,
}
}
}
pub trait SpanningTransformer: Transformer {
fn span(&self, src: &[u8], eof: bool) -> io::Result<usize>;
}
pub struct Chain<T, U> {
first: T,
second: U,
done_first: bool,
}
impl<T: Transformer, U: Transformer> Transformer for Chain<T, U> {
fn transform(&mut self, dst: &mut [u8], src: &[u8], eof: bool) -> io::Result<(usize, usize)> {
let mut ndst: usize = 0;
let mut nsrc: usize = 0;
if !self.done_first {
let (d, s) = self.first.transform(dst, src, eof)?;
ndst += d;
nsrc += s;
self.done_first = true;
}
let (d, s) = self.second.transform(dst, src, eof)?;
Ok((d + ndst, s + nsrc))
}
fn reset(&mut self) {
self.done_first = false;
}
}