refactor: code readable.

This commit is contained in:
2025-12-19 00:02:43 +08:00
parent 09f2452bc4
commit b32cac8356
5 changed files with 110 additions and 109 deletions

87
src/meta/progress.rs Normal file
View File

@@ -0,0 +1,87 @@
use std::sync::{Arc, Mutex};
use std::time::Instant;
use indicatif::{ProgressBar, ProgressStyle};
use crate::utils::friendly_size;
/// 进度跟踪器,封装进度条和 IO 统计信息
pub struct ProgressTracker {
progress_bar: Option<ProgressBar>,
bytes_read: Arc<Mutex<u64>>,
iops: Arc<Mutex<u64>>,
start_time: Instant,
}
impl ProgressTracker {
/// 创建新的进度跟踪器
pub fn new(total_files: u64, message: &str) -> Self {
let progress_bar = if total_files > 0 {
let pb = ProgressBar::new(total_files);
pb.set_style(
ProgressStyle::default_bar()
.template("{spinner:.green} [{elapsed_precise}] [{wide_bar:.cyan/blue}] {pos}/{len} ({percent}%) {msg}")
.unwrap()
.progress_chars("#>-"),
);
pb.set_message(message.to_string());
Some(pb)
} else {
None
};
Self {
progress_bar,
bytes_read: Arc::new(Mutex::new(0u64)),
iops: Arc::new(Mutex::new(0u64)),
start_time: Instant::now(),
}
}
/// 完成一个文件的处理
pub fn finish_file(&self) {
if let Some(pb) = &self.progress_bar {
pb.inc(1);
self.update_message();
}
}
/// 更新进度条消息
fn update_message(&self) {
if let Some(pb) = &self.progress_bar {
let elapsed = self.start_time.elapsed().as_secs_f64();
let total_bytes = *self.bytes_read.lock().unwrap();
let total_ops = *self.iops.lock().unwrap();
if total_bytes > 0 && elapsed > 0.0 {
let speed_bytes_per_sec = total_bytes as f64 / elapsed;
let speed_str = friendly_size(speed_bytes_per_sec as u64);
let iops = total_ops as f64 / elapsed;
pb.set_message(format!("IO速度: {}/s | IOPS: {:.0}", speed_str, iops));
}
}
}
/// 完成所有处理
pub fn finish(&self, message: &str) {
if let Some(pb) = &self.progress_bar {
pb.finish_with_message(message.to_string());
}
}
/// 获取字节读取回调(可 move
pub fn bytes_callback(&self) -> impl FnMut(u64) {
let bytes_read = self.bytes_read.clone();
move |bytes| {
*bytes_read.lock().unwrap() += bytes;
}
}
/// 获取 IO 操作回调(可 move
pub fn iop_callback(&self) -> impl FnMut() {
let iops = self.iops.clone();
move || {
*iops.lock().unwrap() += 1;
}
}
}