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}