#![allow(non_snake_case)]
use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[cfg_attr(feature = "pyo3", pyo3::prelude::pyclass(get_all, set_all))]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiQueueConfig {
pub enabled: bool,
pub backend_type: RiQueueBackendType,
pub connection_string: String,
pub max_connections: u32,
pub message_max_size: usize,
pub consumer_timeout_ms: u64,
pub producer_timeout_ms: u64,
pub retry_policy: RiRetryPolicy,
pub dead_letter_config: Option<RiDeadLetterConfig>,
}
impl Default for RiQueueConfig {
fn default() -> Self {
Self {
enabled: true,
backend_type: RiQueueBackendType::Memory,
connection_string: "memory://localhost".to_string(),
max_connections: 10,
message_max_size: 1024 * 1024, consumer_timeout_ms: 30000, producer_timeout_ms: 5000, retry_policy: RiRetryPolicy::default(),
dead_letter_config: None,
}
}
}
#[cfg_attr(feature = "pyo3", pyo3::prelude::pyclass)]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum RiQueueBackendType {
Memory,
RabbitMQ,
Kafka,
Redis,
}
#[cfg(feature = "pyo3")]
#[pyo3::prelude::pymethods]
impl RiQueueBackendType {
#[staticmethod]
fn from_string(s: String) -> Self {
s.parse().unwrap_or(RiQueueBackendType::Memory)
}
}
impl FromStr for RiQueueBackendType {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"memory" => Ok(RiQueueBackendType::Memory),
"rabbitmq" => Ok(RiQueueBackendType::RabbitMQ),
"kafka" => Ok(RiQueueBackendType::Kafka),
"redis" => Ok(RiQueueBackendType::Redis),
_ => Err(format!("Unknown queue backend type: {s}")),
}
}
}
#[cfg_attr(feature = "pyo3", pyo3::prelude::pyclass(get_all, set_all))]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiRetryPolicy {
pub max_retries: u32,
pub initial_delay_ms: u64,
pub max_delay_ms: u64,
pub backoff_multiplier: f64,
}
impl Default for RiRetryPolicy {
fn default() -> Self {
Self {
max_retries: 3,
initial_delay_ms: 1000,
max_delay_ms: 60000,
backoff_multiplier: 2.0,
}
}
}
#[cfg(feature = "pyo3")]
#[pyo3::prelude::pymethods]
impl RiRetryPolicy {
#[new]
fn py_new() -> Self {
Self::default()
}
#[staticmethod]
fn py_new_with_values(max_retries: u32, initial_delay_ms: u64, max_delay_ms: u64, backoff_multiplier: f64) -> Self {
Self {
max_retries,
initial_delay_ms,
max_delay_ms,
backoff_multiplier,
}
}
}
#[cfg_attr(feature = "pyo3", pyo3::prelude::pyclass(get_all, set_all))]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RiDeadLetterConfig {
pub enabled: bool,
pub max_retry_count: u32,
pub dead_letter_queue_name: String,
pub ttl_hours: u32,
}
impl Default for RiDeadLetterConfig {
fn default() -> Self {
Self {
enabled: false,
max_retry_count: 3,
dead_letter_queue_name: "dead_letter".to_string(),
ttl_hours: 24,
}
}
}
#[cfg(feature = "pyo3")]
#[pyo3::prelude::pymethods]
impl RiDeadLetterConfig {
#[new]
fn py_new() -> Self {
Self::default()
}
#[staticmethod]
fn py_new_enabled(dead_letter_queue_name: String, ttl_hours: u32) -> Self {
Self {
enabled: true,
max_retry_count: 3,
dead_letter_queue_name,
ttl_hours,
}
}
}
#[cfg(feature = "pyo3")]
#[pyo3::prelude::pymethods]
impl RiQueueConfig {
#[new]
fn py_new() -> Self {
Self::default()
}
#[staticmethod]
fn py_new_with_memory_backend() -> Self {
Self {
enabled: true,
backend_type: RiQueueBackendType::Memory,
connection_string: "memory://localhost".to_string(),
..Self::default()
}
}
#[staticmethod]
fn py_new_with_redis_backend(connection_string: String) -> Self {
Self {
enabled: true,
backend_type: RiQueueBackendType::Redis,
connection_string,
..Self::default()
}
}
}