simple_git/
cancellation_token.rsuse std::sync::{
atomic::{AtomicBool, Ordering::Relaxed},
Arc,
};
use derive_destructure2::destructure;
#[derive(Clone, Debug, Default)]
pub struct GitCancellationToken(Arc<AtomicBool>);
impl GitCancellationToken {
#[must_use = "You must assign the guard to a variable, \
otherwise it is equivalent to `GitCancellationToken::cancel()`"]
pub fn cancel_on_drop(self) -> GitCancelOnDrop {
GitCancelOnDrop(self)
}
pub fn cancel(&self) {
self.0.store(true, Relaxed)
}
pub(super) fn get_atomic(&self) -> &AtomicBool {
&self.0
}
}
#[derive(Debug, destructure)]
pub struct GitCancelOnDrop(GitCancellationToken);
impl Drop for GitCancelOnDrop {
fn drop(&mut self) {
self.0.cancel()
}
}
impl GitCancelOnDrop {
pub fn disarm(self) -> GitCancellationToken {
self.destructure().0
}
}