use crate::buffer::{InputBuf, Stream, StreamError};
use crate::primitives::IntoInner;
use crate::types::{Input, ParseResult};
#[derive(Debug, Eq, PartialEq, Hash)]
pub struct SliceStream<'i, I> {
pos: usize,
slice: &'i [I],
}
impl<'i, I: 'i> SliceStream<'i, I> {
#[inline]
pub fn new(slice: &'i [I]) -> Self {
SliceStream { pos: 0, slice }
}
#[inline]
pub fn len(&self) -> usize {
self.slice.len() - self.pos
}
#[inline]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
}
impl<'a, 'i, I: 'i + Copy + PartialEq> Stream<'a, 'i> for SliceStream<'i, I> {
type Input = InputBuf<'i, I>;
#[inline]
fn parse<F, T, E>(
&'a mut self,
f: F,
) -> Result<T, StreamError<<Self::Input as Input>::Buffer, E>>
where
F: FnOnce(Self::Input) -> ParseResult<Self::Input, T, E>,
T: 'i,
E: 'i,
{
use crate::primitives::Primitives;
if self.is_empty() {
return Err(StreamError::EndOfInput);
}
match f(InputBuf::new(&self.slice[self.pos..])).into_inner() {
(remainder, Ok(data)) => {
self.pos += self.len() - remainder.len();
Ok(data)
}
(mut remainder, Err(err)) => {
if remainder.is_incomplete() {
Err(StreamError::Incomplete)
} else {
let r = remainder.len();
self.pos += self.len() - r;
Err(StreamError::ParseError(remainder.consume_remaining(), err))
}
}
}
}
}