ux: add spinner fallback when percent unknown
This commit is contained in:
@@ -680,6 +680,7 @@ fn watch_fix(paths: Vec<PathBuf>, config: &Config, ruleset: &RuleSet, dry_run: b
|
|||||||
struct ProgressState {
|
struct ProgressState {
|
||||||
last_emit: Instant,
|
last_emit: Instant,
|
||||||
last_percent: Option<u8>,
|
last_percent: Option<u8>,
|
||||||
|
spinner_index: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_progress_callback(
|
fn make_progress_callback(
|
||||||
@@ -694,6 +695,7 @@ fn make_progress_callback(
|
|||||||
let state = Arc::new(Mutex::new(ProgressState {
|
let state = Arc::new(Mutex::new(ProgressState {
|
||||||
last_emit: now.checked_sub(Duration::from_secs(2)).unwrap_or(now),
|
last_emit: now.checked_sub(Duration::from_secs(2)).unwrap_or(now),
|
||||||
last_percent: None,
|
last_percent: None,
|
||||||
|
spinner_index: 0,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
Arc::new(move |progress: DecodeProgress| {
|
Arc::new(move |progress: DecodeProgress| {
|
||||||
@@ -703,19 +705,27 @@ fn make_progress_callback(
|
|||||||
.percent
|
.percent
|
||||||
.map(|value| value.max(0.0).min(100.0).floor() as u8);
|
.map(|value| value.max(0.0).min(100.0).floor() as u8);
|
||||||
|
|
||||||
|
let mut spinner_char = None;
|
||||||
if let Ok(mut state) = state.lock() {
|
if let Ok(mut state) = state.lock() {
|
||||||
if let Some(pct) = percent {
|
if let Some(pct) = percent {
|
||||||
if state.last_percent.map_or(true, |last| pct >= last.saturating_add(1)) {
|
if state.last_percent.map_or(true, |last| pct >= last.saturating_add(1)) {
|
||||||
state.last_percent = Some(pct);
|
state.last_percent = Some(pct);
|
||||||
should_emit = true;
|
should_emit = true;
|
||||||
}
|
}
|
||||||
|
} else if now.duration_since(state.last_emit) >= Duration::from_secs(1) {
|
||||||
|
should_emit = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if !should_emit && now.duration_since(state.last_emit) < Duration::from_secs(1) {
|
if !should_emit {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
state.last_emit = now;
|
state.last_emit = now;
|
||||||
|
if percent.is_none() && !progress.done {
|
||||||
|
const SPINNER: [char; 4] = ['|', '/', '-', '\\'];
|
||||||
|
spinner_char = Some(SPINNER[state.spinner_index % SPINNER.len()]);
|
||||||
|
state.spinner_index = state.spinner_index.wrapping_add(1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut line = String::new();
|
let mut line = String::new();
|
||||||
@@ -724,6 +734,11 @@ fn make_progress_callback(
|
|||||||
|
|
||||||
if let Some(pct) = percent {
|
if let Some(pct) = percent {
|
||||||
line.push_str(&format!("{:>3}% ", pct));
|
line.push_str(&format!("{:>3}% ", pct));
|
||||||
|
} else if progress.done {
|
||||||
|
line.push_str("done ");
|
||||||
|
} else if let Some(spinner) = spinner_char {
|
||||||
|
line.push(spinner);
|
||||||
|
line.push(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
match (progress.out_time, progress.duration) {
|
match (progress.out_time, progress.duration) {
|
||||||
|
|||||||
Reference in New Issue
Block a user