ge_man/
progress.rs

1use std::io::Read;
2
3use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle};
4
5use ge_man_lib::download::response::GeAsset;
6use ge_man_lib::download::ReadProgressWrapper;
7
8fn style() -> ProgressStyle {
9    ProgressStyle::default_bar()
10        .template("{msg} {spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {bytes}/{total_bytes} ({eta})")
11        .progress_chars("=>-")
12}
13
14#[derive(Clone)]
15pub struct DownloadProgressTracker {
16    pb: ProgressBar,
17}
18
19impl DownloadProgressTracker {
20    pub fn new(pb: ProgressBar) -> Self {
21        DownloadProgressTracker { pb }
22    }
23}
24
25impl Default for DownloadProgressTracker {
26    fn default() -> Self {
27        DownloadProgressTracker::new(ProgressBar::new(0))
28    }
29}
30
31impl ReadProgressWrapper for DownloadProgressTracker {
32    fn init(self: Box<Self>, len: u64, _asset: &GeAsset) -> Box<dyn ReadProgressWrapper> {
33        let pb = ProgressBar::with_draw_target(len, ProgressDrawTarget::stdout())
34            .with_style(style())
35            .with_message("Downloading archive:");
36
37        Box::new(DownloadProgressTracker::new(pb))
38    }
39
40    fn wrap(&self, reader: Box<dyn Read>) -> Box<dyn Read> {
41        Box::new(self.pb.wrap_read(reader))
42    }
43
44    fn finish(&self, asset: &GeAsset) {
45        self.pb
46            .finish_with_message(format!("Finished download of {}", asset.name))
47    }
48}
49
50pub struct ExtractionProgressTracker {
51    pb: ProgressBar,
52}
53
54impl ExtractionProgressTracker {
55    pub fn new(len: u64) -> Self {
56        let pb = ProgressBar::with_draw_target(len, ProgressDrawTarget::stdout())
57            .with_message("Extracting archive:")
58            .with_style(style());
59
60        ExtractionProgressTracker { pb }
61    }
62
63    pub fn inner(&self) -> &ProgressBar {
64        &self.pb
65    }
66
67    pub fn finish(&self) {
68        self.pb.finish_with_message("Finished archive extraction");
69    }
70}