use crate::WriteError;
pub trait Write {
type Error;
fn write_bytes(&mut self, b: &[u8]) -> Result<(), Self::Error>;
}
pub struct SliceWriter<'a> {
buf: &'a mut [u8],
pos: usize,
}
impl<'a> SliceWriter<'a> {
pub fn new(buf: &'a mut [u8]) -> Self {
Self { buf, pos: 0 }
}
pub fn written(&self) -> &[u8] {
&self.buf[..self.pos]
}
pub fn pos(&self) -> usize {
self.pos
}
pub fn reset(&mut self) {
self.pos = 0;
}
}
impl Write for SliceWriter<'_> {
type Error = WriteError;
fn write_bytes(&mut self, b: &[u8]) -> Result<(), WriteError> {
let end = self.pos + b.len();
if end > self.buf.len() {
return Err(WriteError::BufferFull);
}
self.buf[self.pos..end].copy_from_slice(b);
self.pos = end;
Ok(())
}
}
#[derive(Default)]
pub struct SizeCounter {
pub count: usize,
}
impl SizeCounter {
pub fn new() -> Self {
Self { count: 0 }
}
}
impl<W: Write> Write for &mut W {
type Error = W::Error;
fn write_bytes(&mut self, b: &[u8]) -> Result<(), W::Error> {
(*self).write_bytes(b)
}
}
impl Write for SizeCounter {
type Error = core::convert::Infallible;
fn write_bytes(&mut self, b: &[u8]) -> Result<(), core::convert::Infallible> {
self.count += b.len();
Ok(())
}
}
#[cfg(feature = "std")]
impl Write for std::vec::Vec<u8> {
type Error = core::convert::Infallible;
fn write_bytes(&mut self, b: &[u8]) -> Result<(), core::convert::Infallible> {
self.extend_from_slice(b);
Ok(())
}
}