use indicatif::{ProgressBar, ProgressStyle};
pub fn create_progress_bar(total_size: u64) -> ProgressBar {
let pb = ProgressBar::new(total_size);
pb.set_style(
ProgressStyle::default_bar()
.template("{percent:>3}%|{wide_bar:.cyan/blue}| {bytes}/{total_bytes} [{elapsed_precise}<{eta}, {bytes_per_sec}]")
.expect("Failed to create progress style")
.progress_chars("█▉▊▋▌▍▎▏ ")
);
pb
}
pub struct ProgressManager {
pub pb: ProgressBar,
}
impl ProgressManager {
pub fn new(total_size: u64, message: &str) -> Self {
let pb = create_progress_bar(total_size);
eprintln!("{message}");
Self { pb }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_progress_bar_template() {
let pb = create_progress_bar(1000);
assert_eq!(pb.length().unwrap(), 1000);
pb.set_position(100);
pb.finish();
}
#[test]
fn test_progress_manager_creation() {
let manager = ProgressManager::new(500, "Test download");
assert_eq!(manager.pb.length().unwrap(), 500);
}
}