Chih-Hung Hsieh | 218e269 | 2020-03-20 13:02:10 -0700 | [diff] [blame^] | 1 | use std::io::{Read, Result}; |
| 2 | use std::time::{Duration, Instant}; |
| 3 | |
| 4 | pub struct Progress<R> { |
| 5 | bytes: usize, |
| 6 | tick: Instant, |
| 7 | stream: R, |
| 8 | } |
| 9 | |
| 10 | impl<R> Progress<R> { |
| 11 | pub fn new(stream: R) -> Self { |
| 12 | Progress { |
| 13 | bytes: 0, |
| 14 | tick: Instant::now() + Duration::from_millis(2000), |
| 15 | stream, |
| 16 | } |
| 17 | } |
| 18 | } |
| 19 | |
| 20 | impl<R: Read> Read for Progress<R> { |
| 21 | fn read(&mut self, buf: &mut [u8]) -> Result<usize> { |
| 22 | let num = self.stream.read(buf)?; |
| 23 | self.bytes += num; |
| 24 | let now = Instant::now(); |
| 25 | if now > self.tick { |
| 26 | self.tick = now + Duration::from_millis(500); |
| 27 | errorf!("downloading... {} bytes\n", self.bytes); |
| 28 | } |
| 29 | Ok(num) |
| 30 | } |
| 31 | } |
| 32 | |
| 33 | impl<R> Drop for Progress<R> { |
| 34 | fn drop(&mut self) { |
| 35 | errorf!("done ({} bytes)\n", self.bytes); |
| 36 | } |
| 37 | } |