use colored::*;
use std::future::Future;
use std::time::Duration;
use tokio::time::{Instant, interval};
pub async fn with_progress_counter<F, T>(message: &str, future: F) -> T
where
F: Future<Output = T>,
{
let start_time = Instant::now();
let mut interval = interval(Duration::from_secs(1));
tokio::pin!(future);
print!("{} ", message.yellow().bold());
std::io::Write::flush(&mut std::io::stdout()).unwrap();
let mut seconds = 0u64;
loop {
tokio::select! {
result = &mut future => {
print!("\r{} {} ({}s)\n",
"✓".green().bold(),
message.green(),
seconds
);
std::io::Write::flush(&mut std::io::stdout()).unwrap();
return result;
}
_ = interval.tick() => {
seconds = start_time.elapsed().as_secs();
print!("\r{} {} ({}s)",
"⏳".blue(),
message.yellow().bold(),
seconds
);
std::io::Write::flush(&mut std::io::stdout()).unwrap();
}
}
}
}