use std::io::{
Result,
Seek,
SeekFrom,
Write,
};
pub struct CountingWriter<W> {
inner: W,
bytes_written: u64,
}
impl<W> CountingWriter<W> {
#[inline]
pub fn new(inner: W) -> Self {
Self {
inner,
bytes_written: 0,
}
}
#[inline]
pub fn bytes_written(&self) -> u64 {
self.bytes_written
}
#[inline]
pub fn get_ref(&self) -> &W {
&self.inner
}
#[inline]
pub fn get_mut(&mut self) -> &mut W {
&mut self.inner
}
#[inline]
pub fn into_inner(self) -> W {
self.inner
}
}
impl<W> Write for CountingWriter<W>
where
W: Write,
{
fn write(&mut self, buffer: &[u8]) -> Result<usize> {
let count = self.inner.write(buffer)?;
self.bytes_written = self.bytes_written.saturating_add(count as u64);
Ok(count)
}
#[inline]
fn flush(&mut self) -> Result<()> {
self.inner.flush()
}
}
impl<W> Seek for CountingWriter<W>
where
W: Seek,
{
#[inline]
fn seek(&mut self, position: SeekFrom) -> Result<u64> {
self.inner.seek(position)
}
}