Skip to main content

queue_runtime/
provider.rs

1//! Provider types and configuration.
2
3use chrono::Duration;
4use serde::{Deserialize, Serialize};
5
6/// Enumeration of supported queue providers
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum ProviderType {
9    AzureServiceBus,
10    AwsSqs,
11    InMemory,
12}
13
14impl ProviderType {
15    /// Get session support level for provider
16    pub fn supports_sessions(&self) -> SessionSupport {
17        match self {
18            Self::AzureServiceBus => SessionSupport::Native,
19            Self::AwsSqs => SessionSupport::Emulated, // Via FIFO queues
20            Self::InMemory => SessionSupport::Native,
21        }
22    }
23
24    /// Check if provider supports batch operations
25    pub fn supports_batching(&self) -> bool {
26        match self {
27            Self::AzureServiceBus => true,
28            Self::AwsSqs => true,
29            Self::InMemory => true,
30        }
31    }
32
33    /// Get maximum message size for provider
34    pub fn max_message_size(&self) -> usize {
35        match self {
36            Self::AzureServiceBus => 1024 * 1024, // 1MB
37            Self::AwsSqs => 256 * 1024,           // 256KB
38            Self::InMemory => 10 * 1024 * 1024,   // 10MB
39        }
40    }
41}
42
43/// Level of session support provided by different providers
44#[derive(Debug, Clone, PartialEq, Eq)]
45pub enum SessionSupport {
46    /// Provider has built-in session support (Azure Service Bus)
47    Native,
48    /// Provider emulates sessions via other mechanisms (AWS SQS FIFO)
49    Emulated,
50    /// Provider cannot support session ordering
51    Unsupported,
52}
53
54/// Configuration for queue client initialization
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct QueueConfig {
57    pub provider: ProviderConfig,
58    pub default_timeout: Duration,
59    pub max_retry_attempts: u32,
60    pub retry_base_delay: Duration,
61    pub enable_dead_letter: bool,
62}
63
64impl Default for QueueConfig {
65    fn default() -> Self {
66        Self {
67            provider: ProviderConfig::InMemory(InMemoryConfig::default()),
68            default_timeout: Duration::seconds(30),
69            max_retry_attempts: 3,
70            retry_base_delay: Duration::seconds(1),
71            enable_dead_letter: true,
72        }
73    }
74}
75
76/// Provider-specific configuration
77#[derive(Debug, Clone, Serialize, Deserialize)]
78pub enum ProviderConfig {
79    AzureServiceBus(AzureServiceBusConfig),
80    AwsSqs(AwsSqsConfig),
81    InMemory(InMemoryConfig),
82}
83
84/// Azure Service Bus configuration
85#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct AzureServiceBusConfig {
87    pub connection_string: Option<String>,
88    pub namespace: Option<String>,
89    #[serde(skip, default = "default_auth_method")]
90    pub auth_method: crate::providers::AzureAuthMethod,
91    pub use_sessions: bool,
92    pub session_timeout: Duration,
93}
94
95fn default_auth_method() -> crate::providers::AzureAuthMethod {
96    crate::providers::AzureAuthMethod::DefaultCredential
97}
98
99/// AWS SQS configuration
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct AwsSqsConfig {
102    pub region: String,
103    pub access_key_id: Option<String>,
104    pub secret_access_key: Option<String>,
105    pub use_fifo_queues: bool,
106}
107
108/// In-memory provider configuration
109#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct InMemoryConfig {
111    pub max_queue_size: usize,
112    pub enable_persistence: bool,
113    pub max_delivery_count: u32,
114    pub default_message_ttl: Option<Duration>,
115    pub enable_dead_letter_queue: bool,
116    pub session_lock_duration: Duration,
117}
118
119impl Default for InMemoryConfig {
120    fn default() -> Self {
121        Self {
122            max_queue_size: 10000,
123            enable_persistence: false,
124            max_delivery_count: 3,
125            default_message_ttl: None,
126            enable_dead_letter_queue: true,
127            session_lock_duration: Duration::minutes(5),
128        }
129    }
130}
131
132#[cfg(test)]
133#[path = "provider_tests.rs"]
134mod tests;