use core::time::Duration;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Decision {
Acquired,
Retry {
after: Duration,
},
Impossible,
}
impl Decision {
#[inline]
#[must_use]
pub const fn is_acquired(&self) -> bool {
matches!(self, Self::Acquired)
}
#[inline]
#[must_use]
pub const fn retry_after(&self) -> Option<Duration> {
match self {
Self::Retry { after } => Some(*after),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::Decision;
use core::time::Duration;
#[test]
fn test_is_acquired_only_for_acquired() {
assert!(Decision::Acquired.is_acquired());
assert!(
!Decision::Retry {
after: Duration::ZERO
}
.is_acquired()
);
assert!(!Decision::Impossible.is_acquired());
}
#[test]
fn test_retry_after_returns_wait_only_for_retry() {
let wait = Duration::from_millis(5);
assert_eq!(Decision::Retry { after: wait }.retry_after(), Some(wait));
assert_eq!(Decision::Acquired.retry_after(), None);
assert_eq!(Decision::Impossible.retry_after(), None);
}
}