use std::sync::Arc;
use std::sync::atomic::{
AtomicU8,
Ordering,
};
const PENDING: u8 = 0;
const ACKED: u8 = 1;
const NACKED: u8 = 2;
#[derive(Debug, Clone)]
pub struct Acknowledgement {
state: Arc<AtomicU8>,
}
impl Acknowledgement {
pub fn new() -> Self {
Self {
state: Arc::new(AtomicU8::new(PENDING)),
}
}
pub fn ack(&self) {
self.state.store(ACKED, Ordering::SeqCst);
}
pub fn nack(&self) {
self.state.store(NACKED, Ordering::SeqCst);
}
pub fn is_acked(&self) -> bool {
self.state.load(Ordering::SeqCst) == ACKED
}
pub fn is_nacked(&self) -> bool {
self.state.load(Ordering::SeqCst) == NACKED
}
pub fn is_completed(&self) -> bool {
self.state.load(Ordering::SeqCst) != PENDING
}
}
impl Default for Acknowledgement {
fn default() -> Self {
Self::new()
}
}