use std::time::Duration;
use lapin::ConnectionProperties;
use crate::topology::{DEFAULT_DEAD_SUFFIX, DEFAULT_DEFERRED_SUFFIX, DEFAULT_RETRY_SUFFIX};
const DEFAULT_DEFERRED_GRANULARITY: Duration = Duration::from_secs(1);
#[derive(Clone, Debug)]
pub struct RabbitMqOptions {
pub connection_properties: ConnectionProperties,
pub retry_suffix: String,
pub dead_suffix: String,
pub declare_dead_letter_queues: bool,
pub deferred_suffix: String,
pub deferred_granularity: Duration,
}
impl Default for RabbitMqOptions {
fn default() -> Self {
Self {
connection_properties: ConnectionProperties::default(),
retry_suffix: DEFAULT_RETRY_SUFFIX.to_owned(),
dead_suffix: DEFAULT_DEAD_SUFFIX.to_owned(),
declare_dead_letter_queues: true,
deferred_suffix: DEFAULT_DEFERRED_SUFFIX.to_owned(),
deferred_granularity: DEFAULT_DEFERRED_GRANULARITY,
}
}
}
impl RabbitMqOptions {
#[must_use]
pub fn connection_properties(mut self, properties: ConnectionProperties) -> Self {
self.connection_properties = properties;
self
}
#[must_use]
pub fn retry_suffix(mut self, suffix: impl Into<String>) -> Self {
self.retry_suffix = suffix.into();
self
}
#[must_use]
pub fn dead_suffix(mut self, suffix: impl Into<String>) -> Self {
self.dead_suffix = suffix.into();
self
}
#[must_use]
pub fn declare_dead_letter_queues(mut self, declare: bool) -> Self {
self.declare_dead_letter_queues = declare;
self
}
#[must_use]
pub fn deferred_suffix(mut self, suffix: impl Into<String>) -> Self {
self.deferred_suffix = suffix.into();
self
}
#[must_use]
pub fn deferred_granularity(mut self, granularity: Duration) -> Self {
self.deferred_granularity = granularity;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_match_the_documented_topology() {
let options = RabbitMqOptions::default();
assert_eq!(options.retry_suffix, ".retry");
assert_eq!(options.dead_suffix, ".dead");
assert!(options.declare_dead_letter_queues);
assert_eq!(options.deferred_suffix, ".deferred");
assert_eq!(options.deferred_granularity, Duration::from_secs(1));
}
#[test]
fn deferral_tunables_can_be_overridden() {
let options = RabbitMqOptions::default()
.deferred_suffix("-hold")
.deferred_granularity(Duration::from_millis(250));
assert_eq!(options.deferred_suffix, "-hold");
assert_eq!(options.deferred_granularity, Duration::from_millis(250));
assert_eq!(options.retry_suffix, ".retry");
assert_eq!(options.dead_suffix, ".dead");
}
#[test]
fn a_zero_granularity_is_accepted_and_clamped_later_not_panicked_on() {
let options = RabbitMqOptions::default().deferred_granularity(Duration::ZERO);
assert_eq!(options.deferred_granularity, Duration::ZERO);
assert_eq!(
crate::topology::deferred_ttl_ms(
Duration::from_millis(7),
options.deferred_granularity
),
Some(7)
);
}
#[test]
fn suffixes_can_be_overridden() {
let options = RabbitMqOptions::default()
.retry_suffix("-wait")
.dead_suffix("-dlq");
assert_eq!(options.retry_suffix, "-wait");
assert_eq!(options.dead_suffix, "-dlq");
assert!(options.declare_dead_letter_queues);
}
#[test]
fn dead_letter_declaration_can_be_disabled() {
let options = RabbitMqOptions::default().declare_dead_letter_queues(false);
assert!(!options.declare_dead_letter_queues);
assert_eq!(options.dead_suffix, ".dead");
}
#[test]
fn connection_properties_can_be_replaced() {
let options = RabbitMqOptions::default()
.connection_properties(ConnectionProperties::default().with_locale("nl_NL".into()));
assert!(format!("{:?}", options.connection_properties).contains("nl_NL"));
}
}