use core::str;
use crate::seal::Seal;
#[derive(Debug)]
pub struct Reader<'a>(&'a [u8]);
impl<'a> Reader<'a> {
pub fn new(buffer: &'a [u8]) -> Self {
Self(buffer)
}
pub fn u8(&mut self) -> Option<u8> {
self.0.first().copied()
}
pub fn bytes(&mut self, len: usize) -> Option<&'a [u8]> {
self.subslice(len)?.get(..len)
}
pub fn str(&mut self, len: usize) -> Option<&'a str> {
str::from_utf8(self.bytes(len)?).ok()
}
pub fn reader(&mut self, len: usize) -> Option<Self> {
Some(Self(self.subslice(len)?))
}
pub fn end(&self) -> Option<()> {
self.0.is_empty().then_some(())
}
pub(crate) fn subslice(&mut self, size: usize) -> Option<&'a [u8]> {
if size > self.0.len() {
return None;
}
let (slice, data) = self.0.split_at(size);
self.0 = data;
Some(slice)
}
}
impl Seal for Reader<'_> {}