use chrono::Duration;
use serde::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ProviderType {
AzureServiceBus,
AwsSqs,
InMemory,
RabbitMq,
Nats,
}
impl ProviderType {
pub fn supports_sessions(&self) -> SessionSupport {
match self {
Self::AzureServiceBus => SessionSupport::Native,
Self::AwsSqs => SessionSupport::Emulated, Self::InMemory => SessionSupport::Native,
Self::RabbitMq => SessionSupport::Emulated, Self::Nats => SessionSupport::Emulated, }
}
pub fn supports_batching(&self) -> bool {
match self {
Self::AzureServiceBus => true,
Self::AwsSqs => true,
Self::InMemory => true,
Self::RabbitMq => true,
Self::Nats => true,
}
}
pub fn max_message_size(&self) -> usize {
match self {
Self::AzureServiceBus => 1024 * 1024, Self::AwsSqs => 256 * 1024, Self::InMemory => 10 * 1024 * 1024, Self::RabbitMq => 128 * 1024 * 1024, Self::Nats => 1024 * 1024, }
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SessionSupport {
Native,
Emulated,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueueConfig {
pub provider: ProviderConfig,
pub default_timeout: Duration,
pub max_retry_attempts: u32,
pub retry_base_delay: Duration,
pub enable_dead_letter: bool,
}
impl Default for QueueConfig {
fn default() -> Self {
Self {
provider: ProviderConfig::InMemory(InMemoryConfig::default()),
default_timeout: Duration::seconds(30),
max_retry_attempts: 3,
retry_base_delay: Duration::seconds(1),
enable_dead_letter: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ProviderConfig {
AzureServiceBus(AzureServiceBusConfig),
AwsSqs(AwsSqsConfig),
InMemory(InMemoryConfig),
RabbitMq(crate::providers::rabbitmq::RabbitMqConfig),
Nats(crate::providers::nats::NatsConfig),
}
#[derive(Clone, Serialize, Deserialize)]
pub struct AzureServiceBusConfig {
#[serde(skip_serializing)]
pub connection_string: Option<String>,
pub namespace: Option<String>,
#[serde(skip, default = "default_auth_method")]
pub auth_method: crate::providers::AzureAuthMethod,
pub use_sessions: bool,
pub session_timeout: Duration,
}
fn default_auth_method() -> crate::providers::AzureAuthMethod {
crate::providers::AzureAuthMethod::DefaultCredential
}
impl fmt::Debug for AzureServiceBusConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("AzureServiceBusConfig")
.field(
"connection_string",
&self.connection_string.as_ref().map(|_| "<REDACTED>"),
)
.field("namespace", &self.namespace)
.field("auth_method", &self.auth_method)
.field("use_sessions", &self.use_sessions)
.field("session_timeout", &self.session_timeout)
.finish()
}
}
#[derive(Clone, Serialize, Deserialize)]
pub struct AwsSqsConfig {
pub region: String,
pub access_key_id: Option<String>,
#[serde(skip)]
pub secret_access_key: Option<String>,
pub use_fifo_queues: bool,
}
impl fmt::Debug for AwsSqsConfig {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("AwsSqsConfig")
.field("region", &self.region)
.field("access_key_id", &self.access_key_id)
.field(
"secret_access_key",
&self.secret_access_key.as_ref().map(|_| "<REDACTED>"),
)
.field("use_fifo_queues", &self.use_fifo_queues)
.finish()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InMemoryConfig {
pub max_queue_size: usize,
pub enable_persistence: bool,
pub max_delivery_count: u32,
pub default_message_ttl: Option<Duration>,
pub enable_dead_letter_queue: bool,
pub session_lock_duration: Duration,
}
impl Default for InMemoryConfig {
fn default() -> Self {
Self {
max_queue_size: 10000,
enable_persistence: false,
max_delivery_count: 3,
default_message_ttl: None,
enable_dead_letter_queue: true,
session_lock_duration: Duration::minutes(5),
}
}
}
#[cfg(test)]
#[path = "provider_tests.rs"]
mod tests;