pkg/callback/
plain.rs

1use std::io::Write;
2
3use crate::Callback;
4
5#[derive(Clone)]
6pub struct PlainCallback {
7    size: u64,
8    unknown_size: bool,
9    pos: u64,
10    len: u64,
11    seek: u64,
12}
13
14impl PlainCallback {
15    pub fn new() -> Self {
16        Self {
17            size: 0,
18            unknown_size: false,
19            pos: 0,
20            len: 10,
21            seek: 0,
22        }
23    }
24
25    fn flush(&self) {
26        let _ = std::io::stderr().flush();
27    }
28}
29
30impl Callback for PlainCallback {
31    fn start_download(&mut self, length: u64, file: &str) {
32        eprint!("Downloading {}", file);
33        self.size = length;
34        self.unknown_size = length == 0;
35        self.pos = 0;
36        self.seek = 0;
37        self.flush();
38    }
39
40    fn increment_downloaded(&mut self, downloaded: u64) {
41        self.pos += downloaded;
42        if self.unknown_size {
43            self.size += downloaded;
44        }
45        let new_seek = (self.pos * self.len) / self.size;
46        while self.seek < new_seek {
47            self.seek += 1;
48            eprint!(".");
49        }
50        self.flush();
51    }
52
53    fn end_download(&mut self) {
54        while self.seek < self.len {
55            self.seek += 1;
56            eprint!(".");
57        }
58        eprintln!("done");
59    }
60}