use std::time::Duration;
use crate::retry::RetryPolicy;
#[derive(Debug, Clone, PartialEq)]
pub struct QueueConfig {
pub name: String,
pub prefetch: u16,
pub retry: RetryPolicy,
pub durable: bool,
pub message_ttl: Option<Duration>,
pub max_priority: Option<u8>,
}
pub const DEFAULT_MAX_PRIORITY: u8 = 10;
impl QueueConfig {
pub fn new(name: impl Into<String>) -> Self {
Self {
name: name.into(),
prefetch: 16,
retry: RetryPolicy::default(),
durable: true,
message_ttl: None,
max_priority: Some(DEFAULT_MAX_PRIORITY),
}
}
pub fn prefetch(mut self, prefetch: u16) -> Self {
self.prefetch = prefetch;
self
}
pub fn retry(mut self, retry: RetryPolicy) -> Self {
self.retry = retry;
self
}
pub fn durable(mut self, durable: bool) -> Self {
self.durable = durable;
self
}
pub fn message_ttl(mut self, ttl: Duration) -> Self {
self.message_ttl = Some(ttl);
self
}
pub fn max_priority(mut self, levels: u8) -> Self {
self.max_priority = (levels > 0).then_some(levels);
self
}
}
pub trait QueueSet:
Copy + Clone + Eq + std::hash::Hash + std::fmt::Debug + Send + Sync + 'static
{
fn all() -> &'static [Self];
fn name(&self) -> &'static str;
fn config(&self) -> QueueConfig;
fn from_name(name: &str) -> Option<Self> {
Self::all().iter().copied().find(|q| q.name() == name)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn max_priority_defaults_to_ten_levels() {
assert_eq!(DEFAULT_MAX_PRIORITY, 10);
assert_eq!(
QueueConfig::new("q").max_priority,
Some(DEFAULT_MAX_PRIORITY)
);
}
#[test]
fn max_priority_zero_turns_priorities_off() {
assert_eq!(QueueConfig::new("q").max_priority(0).max_priority, None);
}
#[test]
fn max_priority_stores_the_number_of_levels() {
assert_eq!(QueueConfig::new("q").max_priority(5).max_priority, Some(5));
assert_eq!(
QueueConfig::new("q").max_priority(255).max_priority,
Some(255)
);
assert_eq!(
QueueConfig::new("q").max_priority(5).max_priority(0),
QueueConfig::new("q").max_priority(0)
);
}
#[test]
fn the_other_builders_leave_max_priority_alone() {
let config = QueueConfig::new("q")
.prefetch(3)
.durable(false)
.message_ttl(Duration::from_secs(1));
assert_eq!(config.max_priority, Some(DEFAULT_MAX_PRIORITY));
}
}