Skip to content

Commit

Permalink
support progress bars without length (#968)
Browse files Browse the repository at this point in the history
Co-authored-by: simonsan <14062932+simonsan@users.noreply.github.com>
  • Loading branch information
aawsome and simonsan committed Dec 16, 2023
1 parent 9bbabce commit ea22ff0
Showing 1 changed file with 39 additions and 12 deletions.
51 changes: 39 additions & 12 deletions src/config/progress_options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ impl ProgressOptions {

/// Create a hidden progress bar
pub fn no_progress() -> RusticProgress {
RusticProgress(ProgressBar::hidden())
RusticProgress(ProgressBar::hidden(), ProgressType::Hidden)
}
}

Expand All @@ -64,7 +64,7 @@ impl ProgressBars for ProgressOptions {
);
p.set_prefix(prefix);
p.enable_steady_tick(self.progress_interval());
RusticProgress(p)
RusticProgress(p, ProgressType::Spinner)
}

fn progress_counter(&self, prefix: impl Into<Cow<'static, str>>) -> RusticProgress {
Expand All @@ -73,12 +73,12 @@ impl ProgressBars for ProgressOptions {
}
let p = ProgressBar::new(0).with_style(
ProgressStyle::default_bar()
.template("[{elapsed_precise}] {prefix:30} {bar:40.cyan/blue} {pos:>10}/{len:10}")
.template("[{elapsed_precise}] {prefix:30} {bar:40.cyan/blue} {pos:>10}")
.unwrap(),
);
p.set_prefix(prefix);
p.enable_steady_tick(self.progress_interval());
RusticProgress(p)
RusticProgress(p, ProgressType::Counter)
}

fn progress_hidden(&self) -> RusticProgress {
Expand All @@ -91,30 +91,57 @@ impl ProgressBars for ProgressOptions {
}
let p = ProgressBar::new(0).with_style(
ProgressStyle::default_bar()
.with_key("my_eta", |s: &ProgressState, w: &mut dyn Write|
match (s.pos(), s.len()){
(pos,Some(len)) if pos != 0 => write!(w,"{:#}", HumanDuration(Duration::from_secs(s.elapsed().as_secs() * (len-pos)/pos))),
(_, _) => write!(w,"-"),
}.unwrap())
.template("[{elapsed_precise}] {prefix:30} {bar:40.cyan/blue} {bytes:>10}/{total_bytes:10} {bytes_per_sec:12} (ETA {my_eta})")
.template("[{elapsed_precise}] {prefix:30} {bar:40.cyan/blue} {bytes:>10} {bytes_per_sec:12}")
.unwrap()
);
p.set_prefix(prefix);
p.enable_steady_tick(self.progress_interval());
RusticProgress(p)
RusticProgress(p, ProgressType::Bytes)
}
}

#[derive(Debug, Clone)]
enum ProgressType {
Hidden,
Spinner,
Counter,
Bytes,
}

/// A default progress bar
#[derive(Debug, Clone)]
pub struct RusticProgress(ProgressBar);
pub struct RusticProgress(ProgressBar, ProgressType);

impl Progress for RusticProgress {
fn is_hidden(&self) -> bool {
self.0.is_hidden()
}

fn set_length(&self, len: u64) {
match self.1 {
ProgressType::Counter => {
self.0.set_style(
ProgressStyle::default_bar()
.template(
"[{elapsed_precise}] {prefix:30} {bar:40.cyan/blue} {pos:>10}/{len:10}",
)
.unwrap(),
);
}
ProgressType::Bytes => {
self.0.set_style(
ProgressStyle::default_bar()
.with_key("my_eta", |s: &ProgressState, w: &mut dyn Write|
match (s.pos(), s.len()){
(pos,Some(len)) if pos != 0 => write!(w,"{:#}", HumanDuration(Duration::from_secs(s.elapsed().as_secs() * (len-pos)/pos))),
(_, _) => write!(w,"-"),
}.unwrap())
.template("[{elapsed_precise}] {prefix:30} {bar:40.cyan/blue} {bytes:>10}/{total_bytes:10} {bytes_per_sec:12} (ETA {my_eta})")
.unwrap()
);
}
_ => {}
}
self.0.set_length(len);
}

Expand Down

0 comments on commit ea22ff0

Please sign in to comment.