mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
51 lines
1 KiB
Rust
51 lines
1 KiB
Rust
use ordered_float::OrderedFloat;
|
|
use serde::Serialize;
|
|
use yazi_macro::impl_data_any;
|
|
|
|
use crate::{Ongoing, Progress};
|
|
|
|
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq, Serialize)]
|
|
pub struct TaskSummary {
|
|
pub total: u32,
|
|
pub success: u32,
|
|
pub failed: u32,
|
|
pub percent: Option<OrderedFloat<f32>>,
|
|
}
|
|
|
|
impl_data_any!(TaskSummary);
|
|
|
|
impl From<&Ongoing> for TaskSummary {
|
|
fn from(value: &Ongoing) -> Self {
|
|
let mut summary = Self::default();
|
|
let mut percent_sum = 0.0f64;
|
|
let mut percent_count = 0;
|
|
|
|
for task in value.values() {
|
|
let s: Self = task.prog.into();
|
|
if s.total == 0 && !task.prog.failed() {
|
|
continue;
|
|
}
|
|
|
|
summary.total += 1;
|
|
if let Some(p) = s.percent {
|
|
percent_sum += p.0 as f64;
|
|
percent_count += 1;
|
|
}
|
|
|
|
if task.prog.running() {
|
|
continue;
|
|
} else if task.prog.success() {
|
|
summary.success += 1;
|
|
} else {
|
|
summary.failed += 1;
|
|
}
|
|
}
|
|
|
|
summary.percent = if percent_count == 0 {
|
|
None
|
|
} else {
|
|
Some(OrderedFloat((percent_sum / percent_count as f64) as f32))
|
|
};
|
|
summary
|
|
}
|
|
}
|