#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum WriteOperation {
Compression,
Recovery,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum WriteProgressEvent<'a> {
OperationStarted {
operation: WriteOperation,
total_bytes: Option<u64>,
total_entries: Option<usize>,
pass: usize,
},
EntryStarted {
operation: WriteOperation,
index: usize,
total_entries: usize,
name: &'a [u8],
input_bytes: u64,
},
EntryFinished {
operation: WriteOperation,
index: usize,
total_entries: usize,
name: &'a [u8],
input_bytes: u64,
},
Advanced {
operation: WriteOperation,
completed_bytes: u64,
total_bytes: u64,
pass: usize,
},
OperationFinished {
operation: WriteOperation,
total_bytes: Option<u64>,
total_entries: Option<usize>,
pass: usize,
},
}
pub trait WriteProgress: Send + Sync {
fn report(&self, event: WriteProgressEvent<'_>);
}
impl<F> WriteProgress for F
where
F: Fn(WriteProgressEvent<'_>) + Send + Sync,
{
fn report(&self, event: WriteProgressEvent<'_>) {
self(event);
}
}
#[derive(Clone, Copy)]
pub(crate) struct ProgressReporter<'a>(pub(crate) &'a dyn WriteProgress);
impl std::fmt::Debug for ProgressReporter<'_> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("ProgressReporter(..)")
}
}
impl ProgressReporter<'_> {
pub(crate) fn report(self, event: WriteProgressEvent<'_>) {
self.0.report(event);
}
}