use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum QueueOverflowPolicy {
#[default]
DropOldest,
DropNewest,
Block {
timeout: Duration,
},
}
impl QueueOverflowPolicy {
#[must_use]
pub fn drop_oldest() -> Self {
Self::DropOldest
}
#[must_use]
pub fn drop_newest() -> Self {
Self::DropNewest
}
#[must_use]
pub fn block(timeout: Duration) -> Self {
Self::Block { timeout }
}
#[must_use]
pub fn may_block(&self) -> bool {
matches!(self, Self::Block { .. })
}
#[must_use]
pub fn timeout(&self) -> Option<Duration> {
match self {
Self::Block { timeout } => Some(*timeout),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_policy() {
let policy = QueueOverflowPolicy::default();
assert!(matches!(policy, QueueOverflowPolicy::DropOldest));
}
#[test]
fn test_constructors() {
assert!(matches!(
QueueOverflowPolicy::drop_oldest(),
QueueOverflowPolicy::DropOldest
));
assert!(matches!(
QueueOverflowPolicy::drop_newest(),
QueueOverflowPolicy::DropNewest
));
let timeout = Duration::from_millis(100);
let policy = QueueOverflowPolicy::block(timeout);
assert!(matches!(policy, QueueOverflowPolicy::Block { .. }));
assert_eq!(policy.timeout(), Some(timeout));
}
#[test]
fn test_may_block() {
assert!(!QueueOverflowPolicy::DropOldest.may_block());
assert!(!QueueOverflowPolicy::DropNewest.may_block());
assert!(QueueOverflowPolicy::block(Duration::from_millis(100)).may_block());
}
}