use std::sync::atomic::AtomicBool;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum LocalFetchProgress {
Reading {
objects: u64,
},
Packing {
objects: (u64, u64),
},
Complete,
}
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct ValidationProgress {
pub objects: (u64, u64),
pub deltas: Option<(u64, u64)>,
pub complete: bool,
}
pub(crate) struct ValidationObserver<'a> {
pub cancel: &'a AtomicBool,
value: ValidationProgress,
notify: &'a mut dyn FnMut(ValidationProgress),
}
impl<'a> ValidationObserver<'a> {
pub fn new(cancel: &'a AtomicBool, notify: &'a mut dyn FnMut(ValidationProgress)) -> Self {
Self {
cancel,
value: ValidationProgress::default(),
notify,
}
}
pub fn decoding(&mut self, total: usize) {
self.value.objects = (0, total as u64);
(self.notify)(self.value);
}
pub fn decoded(&mut self) {
self.value.objects.0 += 1;
(self.notify)(self.value);
}
pub fn resolving(&mut self, total: usize) {
self.value.deltas = Some((0, total as u64));
(self.notify)(self.value);
}
pub fn resolved_delta(&mut self) {
self.value.deltas.as_mut().unwrap().0 += 1;
(self.notify)(self.value);
}
pub fn complete(&mut self) {
self.value.deltas.get_or_insert((0, 0));
self.value.complete = true;
(self.notify)(self.value);
}
}