use std::borrow::Cow;
use std::io::{self, IsTerminal};
use std::time::Duration;
use indicatif::{ProgressBar, ProgressDrawTarget, ProgressStyle};
const TICK_INTERVAL: Duration = Duration::from_millis(120);
pub(crate) struct AnalysisProgress {
bar: ProgressBar,
}
impl AnalysisProgress {
pub(crate) fn new() -> Self {
let bar = ProgressBar::with_draw_target(None, draw_target());
bar.set_style(spinner_style());
bar.enable_steady_tick(TICK_INTERVAL);
Self { bar }
}
pub(crate) fn set_stage(&self, message: impl Into<Cow<'static, str>>) {
self.bar.set_message(message);
}
pub(crate) fn finish(&self) {
self.bar.finish_and_clear();
}
}
impl Drop for AnalysisProgress {
fn drop(&mut self) {
self.bar.finish_and_clear();
}
}
fn draw_target() -> ProgressDrawTarget {
if io::stderr().is_terminal() {
ProgressDrawTarget::stderr()
} else {
ProgressDrawTarget::hidden()
}
}
fn spinner_style() -> ProgressStyle {
ProgressStyle::with_template("{spinner:.cyan} {msg}")
.unwrap_or_else(|_| ProgressStyle::default_spinner())
}