blob: 1003abeb761ffc9d4a370f9f5efa2b76408c1a7a [file] [log] [blame] [edit]
use std::marker;
use crate::raw;
use crate::util::Binding;
/// Struct representing the progress by an in-flight transfer.
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),
}
/// Callback to be invoked while indexing is in progress.
///
/// This callback will be periodically called with updates to the progress of
/// the indexing so far. The return value indicates whether the indexing or
/// transfer should continue. A return value of `false` will cancel the
/// indexing or transfer.
///
/// * `progress` - the progress being made so far.
pub type IndexerProgress<'a> = dyn FnMut(Progress<'_>) -> bool + 'a;
impl<'a> Progress<'a> {
/// Number of objects in the packfile being downloaded
pub fn total_objects(&self) -> usize {
unsafe { (*self.raw()).total_objects as usize }
}
/// Received objects that have been hashed
pub fn indexed_objects(&self) -> usize {
unsafe { (*self.raw()).indexed_objects as usize }
}
/// Objects which have been downloaded
pub fn received_objects(&self) -> usize {
unsafe { (*self.raw()).received_objects as usize }
}
/// Locally-available objects that have been injected in order to fix a thin
/// pack.
pub fn local_objects(&self) -> usize {
unsafe { (*self.raw()).local_objects as usize }
}
/// Number of deltas in the packfile being downloaded
pub fn total_deltas(&self) -> usize {
unsafe { (*self.raw()).total_deltas as usize }
}
/// Received deltas that have been hashed.
pub fn indexed_deltas(&self) -> usize {
unsafe { (*self.raw()).indexed_deltas as usize }
}
/// Size of the packfile received up to now
pub fn received_bytes(&self) -> usize {
unsafe { (*self.raw()).received_bytes as usize }
}
/// Convert this to an owned version of `Progress`.
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 _,
}
}
}
/// Callback to be invoked while a transfer is in progress.
///
/// This callback will be periodically called with updates to the progress of
/// the transfer so far. The return value indicates whether the transfer should
/// continue. A return value of `false` will cancel the transfer.
///
/// * `progress` - the progress being made so far.
#[deprecated(
since = "0.11.0",
note = "renamed to `IndexerProgress` to match upstream"
)]
#[allow(dead_code)]
pub type TransportProgress<'a> = IndexerProgress<'a>;