use crate::parsing::{Outcome, ParserState};
#[derive(Debug, Default)]
pub struct BufferManager {
buffer: Vec<u8>,
rstart: usize,
}
impl BufferManager {
pub fn with_initial_size(cap: usize) -> Self {
BufferManager {
buffer: vec![0; cap],
rstart: 0,
}
}
pub fn get_write_slice(&mut self) -> &mut [u8] {
if self.rstart == self.buffer.len() {
self.buffer
.resize(std::cmp::max(self.buffer.len() * 2, 1 << 12), 0);
}
&mut self.buffer[self.rstart..]
}
pub fn process_write<P, E>(
&mut self,
parser: P,
readcnt: usize,
) -> Result<Outcome<P, P::Output>, E>
where
P: ParserState<[u8]>,
E: From<P::Error>,
{
use crate::parsing::Update;
use Outcome::Parsed;
let end = self.rstart + readcnt;
let rslice = &self.buffer[..end];
if readcnt == 0 {
let output = parser.end_input(rslice)?;
Ok(Parsed(output))
} else {
let Update { consumed, outcome } = parser.feed(rslice)?;
self.buffer.rotate_left(consumed);
self.rstart = end - consumed;
Ok(outcome)
}
}
}