From af9f0b51256640cbe54af3a6e280a90ac7ea4840 Mon Sep 17 00:00:00 2001 From: "andy.boot" Date: Sat, 21 Jan 2023 16:40:43 +0000 Subject: [PATCH] refactor: progress bar Pull out display code into different functions Experimented with printing the actual directory currently being parsed but this resulted into too many flickering hard to follow prints. It's cleaner to just print the target directory rather than the directory currently being examined by the dir_walker. --- src/dir_walker.rs | 2 +- src/progress.rs | 37 +++++++++++++++++-------------------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/dir_walker.rs b/src/dir_walker.rs index 717d432..2863751 100644 --- a/src/dir_walker.rs +++ b/src/dir_walker.rs @@ -40,6 +40,7 @@ pub fn walk_it(dirs: HashSet, walk_data: WalkData) -> Vec { let node = walk(d, &walk_data, 0)?; prog_data.state.store(Operation::PREPARING, ORDERING); + clean_inodes(node, &mut inodes, walk_data.use_apparent_size) }) .collect(); @@ -125,7 +126,6 @@ fn ignore_file(entry: &DirEntry, walk_data: &WalkData) -> bool { fn walk(dir: PathBuf, walk_data: &WalkData, depth: usize) -> Option { let prog_data = &walk_data.progress_data; - let mut children = vec![]; if let Ok(entries) = fs::read_dir(&dir) { diff --git a/src/progress.rs b/src/progress.rs index 54866f0..530ce8f 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -69,13 +69,19 @@ impl PAtomicInfo { } /* -------------------------------------------------------------------------- */ -fn format_indicator_str(data: &PAtomicInfo, progress_char_i: usize, status: &str) -> String { - format!( - "\r{} \"{}\"... {}", - status, - data.current_path.get(), - PROGRESS_CHARS[progress_char_i], - ) + +fn format_preparing_str(prog_char: char, data: &PAtomicInfo, is_iso: bool) -> String { + let path_in = data.current_path.get(); + let size = human_readable_number(data.total_file_size.load(ORDERING), is_iso); + format!("Preparing: {} {} ... {}", path_in, size, prog_char) +} + +fn format_indexing_str(prog_char: char, data: &PAtomicInfo, is_iso: bool) -> String { + let path_in = data.current_path.get(); + let file_count = data.num_files.load(ORDERING); + let size = human_readable_number(data.total_file_size.load(ORDERING), is_iso); + let file_str = format!("{} files, {}", file_count, size); + format!("Indexing: {} {} ... {}", path_in, file_str, prog_char) } pub struct PIndicator { @@ -109,24 +115,15 @@ impl PIndicator { { // Clear the text written by 'write!'& Return at the start of line print!("\r{:width$}", " ", width = msg.len()); + let prog_char = PROGRESS_CHARS[progress_char_i]; msg = match data.state.load(ORDERING) { - Operation::INDEXING => { - let base = format_indicator_str(&data, progress_char_i, "Indexing"); - - let file_count = data.num_files.load(ORDERING); - let size = - human_readable_number(data.total_file_size.load(ORDERING), is_iso); - let file_str = format!("{} {} files", file_count, size); - format!("{} - {}", base, file_str) - } - Operation::PREPARING => { - format_indicator_str(&data, progress_char_i, "Preparing") - } + Operation::INDEXING => format_indexing_str(prog_char, &data, is_iso), + Operation::PREPARING => format_preparing_str(prog_char, &data, is_iso), _ => panic!("Unknown State"), }; - write!(stdout, "{}", msg).unwrap(); + write!(stdout, "\r{}", msg).unwrap(); stdout.flush().unwrap(); progress_char_i += 1;