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}