use std::io::{Read, Result}; use std::time::{Duration, Instant}; pub struct Progress { bytes: usize, tick: Instant, stream: R, } impl Progress { pub fn new(stream: R) -> Self { Progress { bytes: 0, tick: Instant::now() + Duration::from_millis(2000), stream, } } } impl Read for Progress { fn read(&mut self, buf: &mut [u8]) -> Result { let num = self.stream.read(buf)?; self.bytes += num; let now = Instant::now(); if now > self.tick { self.tick = now + Duration::from_millis(500); errorf!("downloading... {} bytes\n", self.bytes); } Ok(num) } } impl Drop for Progress { fn drop(&mut self) { errorf!("done ({} bytes)\n", self.bytes); } }