From 9ff28b345679d9a52672941c6ec85bb70168be25 Mon Sep 17 00:00:00 2001 From: "andy.boot" Date: Sat, 21 Jan 2023 15:53:34 +0000 Subject: [PATCH] refactor: progress bar code to clear line should be just before next write. Otherwise a buffer flush may occur that wipes out the line before it can be read by the user. --- src/progress.rs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/progress.rs b/src/progress.rs index 201559a..54866f0 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -100,13 +100,17 @@ impl PIndicator { let time_info_thread = std::thread::spawn(move || { let mut progress_char_i: usize = 0; let mut stdout = std::io::stdout(); + let mut msg = "".to_string(); // While the timeout triggers we go round the loop // If we disconnect or the sender sends its message we exit the while loop while let Err(RecvTimeoutError::Timeout) = receiver.recv_timeout(Duration::from_millis(SPINNER_SLEEP_TIME)) { - let msg = match data.state.load(ORDERING) { + // Clear the text written by 'write!'& Return at the start of line + print!("\r{:width$}", " ", width = msg.len()); + + msg = match data.state.load(ORDERING) { Operation::INDEXING => { let base = format_indicator_str(&data, progress_char_i, "Indexing"); @@ -127,12 +131,7 @@ impl PIndicator { progress_char_i += 1; progress_char_i %= PROGRESS_CHARS_LEN; - - // Clear the text written by 'write!' - print!("\r{:width$}", " ", width = msg.len()); } - - // Return at the start of the line so the output can be printed correctly print!("\r"); stdout.flush().unwrap(); });