use core::time::Duration;
#[must_use]
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Decision {
Allowed,
Denied {
retry_after: Duration,
},
}
impl Decision {
#[must_use]
pub const fn is_allowed(&self) -> bool {
matches!(self, Self::Allowed)
}
#[must_use]
pub const fn is_denied(&self) -> bool {
!self.is_allowed()
}
#[must_use]
pub const fn retry_after(&self) -> Option<Duration> {
match self {
Self::Denied { retry_after } => Some(*retry_after),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::Decision;
use core::time::Duration;
#[test]
fn test_allowed_predicates() {
let allowed = Decision::Allowed;
assert!(allowed.is_allowed());
assert!(!allowed.is_denied());
assert_eq!(allowed.retry_after(), None);
}
#[test]
fn test_denied_predicates() {
let denied = Decision::Denied {
retry_after: Duration::from_secs(2),
};
assert!(denied.is_denied());
assert!(!denied.is_allowed());
assert_eq!(denied.retry_after(), Some(Duration::from_secs(2)));
}
}