use std::io::{sink, Result as IoResult, Sink, Write};
#[derive(Debug)]
pub struct ByteCounter<T> {
inner: T,
count: usize,
}
impl<T> ByteCounter<T> {
pub fn new(inner: T) -> Self {
ByteCounter { inner, count: 0 }
}
pub fn count(&self) -> usize {
self.count
}
}
impl ByteCounter<Sink> {
pub fn with_sink() -> Self {
Self::new(sink())
}
pub fn calculate<F>(f: F) -> IoResult<u64>
where
F: FnOnce(&mut Self) -> IoResult<()>,
{
let mut writer = ByteCounter::with_sink();
f(&mut writer)?;
Ok(writer.count() as u64)
}
}
impl<T: Write> Write for ByteCounter<T> {
fn write(&mut self, buf: &[u8]) -> IoResult<usize> {
let size = self.inner.write(buf)?;
self.count += size;
Ok(size)
}
fn flush(&mut self) -> IoResult<()> {
self.inner.flush()
}
}