use crate::error::Error;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct Progress {
pub consumed: usize,
pub written: usize,
pub done: bool,
}
pub trait Encoder {
fn encode(&mut self, input: &[u8], output: &mut [u8]) -> Result<Progress, Error>;
fn finish(&mut self, output: &mut [u8]) -> Result<Progress, Error>;
fn reset(&mut self);
}
pub trait Decoder {
fn decode(&mut self, input: &[u8], output: &mut [u8]) -> Result<Progress, Error>;
fn finish(&mut self, output: &mut [u8]) -> Result<Progress, Error>;
fn reset(&mut self);
fn skip(&mut self, input: &[u8], n: usize) -> Result<Progress, Error> {
let mut scratch = [0u8; 1024];
let mut consumed = 0usize;
let mut skipped = 0usize;
while skipped < n {
let want = (n - skipped).min(scratch.len());
let p = self.decode(&input[consumed..], &mut scratch[..want])?;
consumed += p.consumed;
skipped += p.written;
if p.consumed == 0 && p.written == 0 {
break;
}
}
Ok(Progress {
consumed,
written: skipped,
done: false,
})
}
}
pub trait Algorithm {
const NAME: &'static str;
type Encoder: Encoder;
type Decoder: Decoder;
fn encoder() -> Self::Encoder;
fn decoder() -> Self::Decoder;
}