use camino::Utf8PathBuf;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum EntryKind {
New,
Modified,
Orphan,
Same,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Entry {
pub kind: EntryKind,
pub path: Utf8PathBuf,
pub size_bytes: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub transcode_from: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum PathWarningKind {
FilenameTooLong,
PathTooLong,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PathWarning {
pub path: Utf8PathBuf,
pub kind: PathWarningKind,
pub length_bytes: usize,
pub limit_bytes: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct Plan {
pub entries: Vec<Entry>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub warnings: Vec<PathWarning>,
}
impl Plan {
pub fn count(&self, kind: EntryKind) -> usize {
self.entries.iter().filter(|e| e.kind == kind).count()
}
pub fn total_bytes(&self, kind: EntryKind) -> u64 {
self.entries
.iter()
.filter(|e| e.kind == kind)
.map(|e| e.size_bytes)
.sum()
}
pub fn transfer_bytes(&self) -> u64 {
self.total_bytes(EntryKind::New) + self.total_bytes(EntryKind::Modified)
}
pub fn eta_secs(&self, speed_bps: u64) -> u64 {
if speed_bps == 0 {
return 0;
}
self.transfer_bytes() / speed_bps
}
}