use std::sync::{
Arc,
atomic::{AtomicBool, Ordering},
};
use crate::error::{RemoteBuildError, RemoteBuildResult};
#[derive(Clone, Debug, Default)]
pub struct CancellationToken {
requested: Arc<AtomicBool>,
}
impl CancellationToken {
pub fn new() -> Self {
Self::default()
}
pub fn cancel(&self) -> bool {
self.requested
.compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire)
.is_ok()
}
pub fn is_cancelled(&self) -> bool {
self.requested.load(Ordering::Acquire)
}
pub fn check(&self) -> RemoteBuildResult<()> {
if self.is_cancelled() {
Err(RemoteBuildError::Cancelled)
} else {
Ok(())
}
}
}