use std::path::PathBuf;
use crate::plan::Action;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RunPhase {
Planning,
Review,
Copying,
Deleting,
Verifying,
Finalizing,
Done,
Cancelled,
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RunStatus {
Success,
Cancelled,
Failed,
}
#[derive(Debug, Clone)]
pub enum Event {
Phase(RunPhase),
PlanningProgress {
entries: usize,
},
BackendSelected {
backend: &'static str,
reason: &'static str,
},
Planned {
total_files: usize,
total_bytes: u64,
deletions: usize,
},
FileStart {
rel: PathBuf,
len: u64,
},
FileDone {
rel: PathBuf,
action: Action,
bytes: u64,
},
DirDone {
rel: PathBuf,
action: Action,
},
SymlinkDone {
rel: PathBuf,
action: Action,
},
Skipped {
rel: PathBuf,
},
Deleted {
rel: PathBuf,
},
Failed {
rel: PathBuf,
error: String,
},
VerificationProgress {
checked: usize,
total: usize,
mismatches: usize,
},
VerificationFailed {
rel: PathBuf,
detail: String,
},
Finished {
status: RunStatus,
},
}
#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct Stats {
pub copied: u64,
pub updated: u64,
pub skipped: u64,
pub deleted: u64,
pub errors: u64,
pub bytes: u64,
}
pub trait Reporter: Sync {
fn event(&self, ev: Event);
}
pub struct NullReporter;
impl Reporter for NullReporter {
fn event(&self, _ev: Event) {}
}