use std::{error::Error, future::Future}; use indicatif::{ProgressBar, ProgressStyle}; pub async fn with_spinner( start_msg: &str, finish_msg: &str, f: F, ) -> Result> where F: FnOnce() -> Fut, Fut: Future>>, { let pb = ProgressBar::new_spinner(); pb.set_message(start_msg.to_string()); pb.enable_steady_tick(std::time::Duration::from_millis(100)); let result = f().await; pb.finish_and_clear(); if !finish_msg.is_empty() { println!("{} {}", dialoguer::console::style("✔").green(), finish_msg); } result } pub async fn with_progressbar( start_msg: &str, finish_msg: &str, len: u64, f: F, ) -> Result> where F: FnOnce(ProgressBar) -> Fut, Fut: Future>> { let pb = ProgressBar::new(len); pb.set_style(ProgressStyle::default_bar().template( "{msg}\n{bar:40.green/white} {bytes}/{total_bytes} ({bytes_per_sec})", )?); pb.set_message(start_msg.to_string()); let result = f(pb.clone()).await; pb.finish_with_message(finish_msg.to_string()); result }