use std::marker;
use crate::raw;
use crate::util::Binding;
pub struct Progress<'a> {
pub(crate) raw: ProgressState,
pub(crate) _marker: marker::PhantomData<&'a raw::git_indexer_progress>,
}
pub(crate) enum ProgressState {
Borrowed(*const raw::git_indexer_progress),
Owned(raw::git_indexer_progress),
}
pub type IndexerProgress<'a> = dyn FnMut(Progress<'_>) -> bool + 'a;
impl<'a> Progress<'a> {
pub fn total_objects(&self) -> usize {
unsafe { (*self.raw()).total_objects as usize }
}
pub fn indexed_objects(&self) -> usize {
unsafe { (*self.raw()).indexed_objects as usize }
}
pub fn received_objects(&self) -> usize {
unsafe { (*self.raw()).received_objects as usize }
}
pub fn local_objects(&self) -> usize {
unsafe { (*self.raw()).local_objects as usize }
}
pub fn total_deltas(&self) -> usize {
unsafe { (*self.raw()).total_deltas as usize }
}
pub fn indexed_deltas(&self) -> usize {
unsafe { (*self.raw()).indexed_deltas as usize }
}
pub fn received_bytes(&self) -> usize {
unsafe { (*self.raw()).received_bytes as usize }
}
pub fn to_owned(&self) -> Progress<'static> {
Progress {
raw: ProgressState::Owned(unsafe { *self.raw() }),
_marker: marker::PhantomData,
}
}
}
impl<'a> Binding for Progress<'a> {
type Raw = *const raw::git_indexer_progress;
unsafe fn from_raw(raw: *const raw::git_indexer_progress) -> Progress<'a> {
Progress {
raw: ProgressState::Borrowed(raw),
_marker: marker::PhantomData,
}
}
fn raw(&self) -> *const raw::git_indexer_progress {
match self.raw {
ProgressState::Borrowed(raw) => raw,
ProgressState::Owned(ref raw) => raw as *const _,
}
}
}
#[deprecated(
since = "0.11.0",
note = "renamed to `IndexerProgress` to match upstream"
)]
#[allow(dead_code)]
pub type TransportProgress<'a> = IndexerProgress<'a>;