mod buffer;
pub mod decoder;
pub use buffer::*;
#[derive(Debug)]
pub struct State<Decoder, Buffer> {
pub decoder: Decoder,
pub buffer: Buffer,
}
pub enum DecodeError<T> {
NeedMoreData,
SkipData(usize),
Other(T),
}
pub struct Decoded<T> {
pub value: T,
pub consumed_bytes: usize,
}
pub trait Decoder<Input>
where
Input: self::Buffer,
{
type Value;
type Error;
fn decode(&mut self, input: &mut Input) -> Result<Self::Value, DecodeError<Self::Error>>;
}
impl<Decoder, Buffer> State<Decoder, Buffer>
where
Decoder: self::Decoder<Buffer>,
Buffer: self::Buffer,
{
pub fn process_next_chunk(&mut self, chunk: &[u8]) -> AvailableIter<'_, Decoder, Buffer> {
self.buffer.append(chunk);
AvailableIter::new(self)
}
pub fn is_empty(&self) -> bool {
self.buffer.view().is_empty()
}
pub fn finish(self) -> Result<(), Buffer> {
if self.is_empty() {
return Ok(());
}
Err(self.buffer)
}
}
pub struct AvailableIter<'state, Decoder, Buffer>
where
Decoder: self::Decoder<Buffer>,
Buffer: self::Buffer,
{
state: &'state mut State<Decoder, Buffer>,
short_circut: bool,
}
impl<'state, Decoder, Buffer> Iterator for AvailableIter<'state, Decoder, Buffer>
where
Decoder: self::Decoder<Buffer>,
Buffer: self::Buffer,
{
type Item = Result<
<Decoder as self::Decoder<Buffer>>::Value,
<Decoder as self::Decoder<Buffer>>::Error,
>;
fn next(&mut self) -> Option<Self::Item> {
if self.short_circut {
return None;
}
loop {
return match self.state.decoder.decode(&mut self.state.buffer) {
Ok(value) => Some(Ok(value)),
Err(DecodeError::NeedMoreData) => None,
Err(DecodeError::SkipData(bytes_to_skip)) => {
self.state.buffer.advance(bytes_to_skip);
continue; }
Err(DecodeError::Other(error)) => {
self.short_circut = true;
Some(Err(error))
}
};
}
}
}
impl<'state, Decoder, Buffer> AvailableIter<'state, Decoder, Buffer>
where
Decoder: self::Decoder<Buffer>,
Buffer: self::Buffer,
{
fn new(state: &'state mut State<Decoder, Buffer>) -> Self {
Self {
state,
short_circut: false,
}
}
pub fn buffer(&self) -> &Buffer {
&self.state.buffer
}
pub fn try_drain(self) -> Result<(), <Decoder as self::Decoder<Buffer>>::Error> {
for result in self {
let _ = result?;
}
Ok(())
}
pub fn try_collect<T>(self) -> Result<T, <Decoder as self::Decoder<Buffer>>::Error>
where
T: FromIterator<<Decoder as self::Decoder<Buffer>>::Value>,
{
self.collect()
}
}