use std::io::Read;
use tracing::trace;
pub(crate) struct Buffer {
pub(crate) buffer: circular::Buffer,
pub(crate) read_bytes: u64,
}
impl Buffer {
pub(crate) fn with_capacity(size: usize) -> Self {
Self {
buffer: circular::Buffer::with_capacity(size),
read_bytes: 0,
}
}
pub(crate) fn reset(&mut self) {
self.read_bytes = 0;
self.buffer.reset();
}
pub(crate) fn read_bytes(&self) -> u64 {
self.read_bytes
}
pub(crate) fn data(&self) -> &[u8] {
self.buffer.data()
}
pub(crate) fn available_data(&self) -> usize {
self.buffer.available_data()
}
pub(crate) fn consume(&mut self, count: usize) -> usize {
self.buffer.consume(count)
}
pub(crate) fn read(&mut self, rd: &mut dyn Read) -> Result<usize, std::io::Error> {
if self.buffer.available_space() == 0 {
trace!("uh oh, buffer has no available space!")
}
match rd.read(self.buffer.space()) {
Ok(written) => {
self.read_bytes += written as u64;
self.buffer.fill(written);
Ok(written)
}
Err(e) => Err(e),
}
}
pub(crate) fn read_offset(&self, offset: u64) -> u64 {
self.read_bytes + offset
}
}