Skip to content

Commit 0a428e6

Browse files
committed
Clean up MultiProgress container.
1 parent c9e8cce commit 0a428e6

File tree

7 files changed

+64
-52
lines changed

7 files changed

+64
-52
lines changed

doc/src/developers/style.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,3 @@
55

66
**Row's** [pre-commit](https://pre-commit.com/) configuration applies style fixes
77
with `rustfmt` checks for common errors with `clippy`.
8-
9-
TODO: Investigate clippy configuration and see if more stringent rules can be applied.

src/cli/submit.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ pub fn submit<W: Write>(
175175

176176
if std::io::stdout().is_terminal() && !args.yes {
177177
let mut input = String::new();
178-
multi_progress.multi_progress.suspend(|| {
178+
multi_progress.suspend(|| {
179179
print!("Proceed? [Y/n]: ");
180180
io::stdout().flush().expect("Can flush stdout");
181181
io::stdin()
@@ -199,8 +199,7 @@ pub fn submit<W: Write>(
199199
// stdin and stdout directly.
200200
project.close(multi_progress)?;
201201

202-
multi_progress.progress_bars.clear();
203-
multi_progress.multi_progress.clear().unwrap();
202+
multi_progress.clear().unwrap();
204203

205204
// Install the Ctrl-C signal handler to gracefully kill spawned processes
206205
// and save the pending scheduled job cache before exiting. Allow the user

src/lib.rs

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub mod state;
1616
pub mod workflow;
1717
pub mod workspace;
1818

19-
use indicatif::{MultiProgress, ProgressBar};
19+
use indicatif::{MultiProgress, ProgressBar, ProgressDrawTarget};
2020
use serde_json::{self, Value};
2121
use std::io;
2222
use std::path::PathBuf;
@@ -36,8 +36,8 @@ const SUBMITTED_CACHE_FILE_NAME: &str = "submitted.postcard";
3636
/// removed from [MultiProgress](https://github.com/console-rs/indicatif/issues/614)
3737
///
3838
pub struct MultiProgressContainer {
39-
pub progress_bars: Vec<ProgressBar>,
40-
pub multi_progress: MultiProgress,
39+
progress_bars: Vec<ProgressBar>,
40+
multi_progress: MultiProgress,
4141
}
4242

4343
/// Errors that may be encountered when using the row crate.
@@ -186,3 +186,45 @@ pub enum Error {
186186
// #[error("Evalexpr error: {0}")]
187187
// Evalexpr(#[from] EvalexprError),
188188
}
189+
190+
impl MultiProgressContainer {
191+
/// Create a new multi-progress container.
192+
pub fn new(multi_progress: MultiProgress) -> MultiProgressContainer {
193+
MultiProgressContainer {
194+
progress_bars: Vec::new(),
195+
multi_progress,
196+
}
197+
}
198+
199+
/// Add a progress bar to the container or hide it.
200+
pub fn add_or_hide(&mut self, mut progress_bar: ProgressBar, hide: bool) -> ProgressBar {
201+
if hide {
202+
progress_bar.set_draw_target(ProgressDrawTarget::hidden());
203+
} else {
204+
progress_bar = self.multi_progress.add(progress_bar);
205+
self.progress_bars.push(progress_bar.clone());
206+
}
207+
208+
progress_bar
209+
}
210+
211+
/// Add a progress bar to the container.
212+
pub fn add(&mut self, progress_bar: ProgressBar) -> ProgressBar {
213+
self.progress_bars.push(progress_bar.clone());
214+
self.multi_progress.add(progress_bar)
215+
}
216+
217+
/// Clear all progress bars
218+
///
219+
/// # Errors
220+
/// Forwards the error from `indicatif::MultiProgress::clear`.
221+
pub fn clear(&mut self) -> Result<(), std::io::Error> {
222+
self.progress_bars.clear();
223+
self.multi_progress.clear()
224+
}
225+
226+
/// Suspend the progress bar updates while executing f.
227+
pub fn suspend<F: FnOnce() -> R, R>(&self, f: F) -> R {
228+
self.multi_progress.suspend(f)
229+
}
230+
}

src/main.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,7 @@ fn main_detail() -> Result<(), Box<dyn Error>> {
6363

6464
LogWrapper::new(multi_progress.clone(), logger).try_init()?;
6565

66-
let mut multi_progress_container = MultiProgressContainer {
67-
progress_bars: Vec::new(),
68-
multi_progress: multi_progress.clone(),
69-
};
66+
let mut multi_progress_container = MultiProgressContainer::new(multi_progress.clone());
7067

7168
match options.command {
7269
Some(Commands::Show(show)) => match show {

src/project.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use indicatif::{ProgressBar, ProgressDrawTarget};
1+
use indicatif::ProgressBar;
22
use log::{debug, trace, warn};
33
use serde_json::Value;
44
use std::cmp::Ordering;
@@ -93,15 +93,9 @@ impl Project {
9393
let jobs = state.jobs_submitted_on(&cluster_name);
9494
let mut progress =
9595
ProgressBar::new_spinner().with_message("Checking submitted job statuses");
96-
if jobs.is_empty() {
97-
progress.set_draw_target(ProgressDrawTarget::hidden());
98-
// TODO: Refactor these types of code blocks into the MultiProgressContainer?
99-
} else {
100-
progress = multi_progress.multi_progress.add(progress);
101-
multi_progress.progress_bars.push(progress.clone());
102-
progress.enable_steady_tick(Duration::from_millis(progress_styles::STEADY_TICK));
103-
}
96+
progress = multi_progress.add_or_hide(progress, jobs.is_empty());
10497

98+
progress.enable_steady_tick(Duration::from_millis(progress_styles::STEADY_TICK));
10599
progress.set_style(progress_styles::uncounted_spinner());
106100
progress.tick();
107101

src/state.rs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use indicatif::{ProgressBar, ProgressDrawTarget};
1+
use indicatif::ProgressBar;
22
use log::{debug, trace, warn};
33
use serde::{Deserialize, Serialize};
44
use serde_json::Value;
@@ -322,12 +322,10 @@ impl State {
322322
// Then remove the staged files.
323323
let mut progress = ProgressBar::new(self.completed_file_names.len() as u64)
324324
.with_message("Removing staged completed actions");
325-
if self.completed_file_names.len() >= MIN_PROGRESS_BAR_SIZE {
326-
progress = multi_progress.multi_progress.add(progress);
327-
multi_progress.progress_bars.push(progress.clone());
328-
} else {
329-
progress.set_draw_target(ProgressDrawTarget::hidden());
330-
}
325+
progress = multi_progress.add_or_hide(
326+
progress,
327+
self.completed_file_names.len() < MIN_PROGRESS_BAR_SIZE,
328+
);
331329
progress.set_style(progress_styles::counted_bar());
332330
progress.tick();
333331

@@ -606,12 +604,10 @@ impl State {
606604

607605
let mut progress = ProgressBar::new(self.completed_file_names.len() as u64)
608606
.with_message("Reading staged completed actions");
609-
if self.completed_file_names.len() >= MIN_PROGRESS_BAR_SIZE {
610-
progress = multi_progress.multi_progress.add(progress);
611-
multi_progress.progress_bars.push(progress.clone());
612-
} else {
613-
progress.set_draw_target(ProgressDrawTarget::hidden());
614-
}
607+
progress = multi_progress.add_or_hide(
608+
progress,
609+
self.completed_file_names.len() < MIN_PROGRESS_BAR_SIZE,
610+
);
615611
progress.set_style(progress_styles::counted_bar());
616612
progress.tick();
617613

src/workspace.rs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use indicatif::{ProgressBar, ProgressDrawTarget};
1+
use indicatif::ProgressBar;
22
use log::debug;
33
use serde_json::Value;
44
use std::collections::{HashMap, HashSet};
@@ -24,10 +24,7 @@ pub fn list_directories(
2424
) -> Result<Vec<PathBuf>, Error> {
2525
let workspace_path = workflow.root.join(&workflow.workspace.path);
2626

27-
let progress = multi_progress
28-
.multi_progress
29-
.add(ProgressBar::new_spinner().with_message("Listing workspace"));
30-
multi_progress.progress_bars.push(progress.clone());
27+
let progress = multi_progress.add(ProgressBar::new_spinner().with_message("Listing workspace"));
3128
progress.set_style(progress_styles::counted_spinner());
3229
progress.enable_steady_tick(Duration::from_millis(progress_styles::STEADY_TICK));
3330

@@ -96,13 +93,7 @@ pub fn find_completed_directories(
9693
) -> CompletedDirectories {
9794
let mut progress =
9895
ProgressBar::new(directories.len() as u64).with_message("Scanning directories");
99-
if directories.len() >= MIN_PROGRESS_BAR_SIZE {
100-
progress = multi_progress.multi_progress.add(progress);
101-
multi_progress.progress_bars.push(progress.clone());
102-
} else {
103-
progress.set_draw_target(ProgressDrawTarget::hidden());
104-
}
105-
96+
progress = multi_progress.add_or_hide(progress, directories.len() < MIN_PROGRESS_BAR_SIZE);
10697
progress.set_style(progress_styles::counted_bar());
10798
progress.tick();
10899

@@ -253,12 +244,7 @@ pub(crate) fn read_values(
253244
let (sender, receiver) = mpsc::channel();
254245

255246
let mut progress = ProgressBar::new(directories.len() as u64).with_message("Reading values");
256-
if directories.len() >= MIN_PROGRESS_BAR_SIZE {
257-
progress = multi_progress.multi_progress.add(progress);
258-
multi_progress.progress_bars.push(progress.clone());
259-
} else {
260-
progress.set_draw_target(ProgressDrawTarget::hidden());
261-
}
247+
progress = multi_progress.add_or_hide(progress, directories.len() < MIN_PROGRESS_BAR_SIZE);
262248
progress.set_style(progress_styles::counted_bar());
263249
progress.tick();
264250

0 commit comments

Comments
 (0)