use std::time::Duration; use indicatif::{MultiProgress, ProgressBar}; pub fn new_section(title: String) -> MultiProgress { let multi_progress = MultiProgress::new(); let _ = multi_progress.println(title); multi_progress } pub fn add_spinner(multi_progress: &MultiProgress, message: String) -> ProgressBar { let progress = multi_progress.add(ProgressBar::new_spinner()); progress.set_style(crate::theme::SPINNER_STYLE.clone()); progress.set_message(message); progress.enable_steady_tick(Duration::from_millis(100)); progress } pub fn success(multi_progress: &MultiProgress, progress: Option, message: String) { if let Some(progress) = progress { multi_progress.remove(&progress) } let progress = multi_progress.add(ProgressBar::new_spinner()); progress.set_style(crate::theme::SUCCESS_SPINNER_STYLE.clone()); progress.finish_with_message(message); } pub fn error(multi_progress: &MultiProgress, progress: Option, message: String) { if let Some(progress) = progress { multi_progress.remove(&progress) } let progress = multi_progress.add(ProgressBar::new_spinner()); progress.set_style(crate::theme::ERROR_SPINNER_STYLE.clone()); progress.finish_with_message(message); } pub fn skip(multi_progress: &MultiProgress, progress: Option, message: String) { if let Some(progress) = progress { multi_progress.remove(&progress) } let progress = multi_progress.add(ProgressBar::new_spinner()); progress.set_style(crate::theme::SKIP_SPINNER_STYLE.clone()); progress.finish_with_message(message); }