use std::time::Duration;
use serde::Deserialize;
use url::Url;
#[derive(Clone, Debug, Deserialize)]
pub struct RedisConfig {
pub host: String,
pub port: u16,
pub database: usize,
pub tracing: bool,
pub pool_size: usize,
pub retries: RetryConfig,
pub key_prefix: String,
}
impl RedisConfig {
pub fn url(&self) -> Url {
Url::parse(&format!(
"redis://{}:{}/{}",
self.host, self.port, self.database
))
.expect("Failed to parse Redis URL")
}
}
impl Default for RedisConfig {
fn default() -> Self {
Self {
host: "localhost".to_string(),
port: 6379,
database: 0,
tracing: false,
pool_size: 8,
retries: RetryConfig::default(),
key_prefix: "".to_string(),
}
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct RetryConfig {
pub max_attempts: u32,
#[serde(with = "humantime_serde")]
pub min_delay: Duration,
#[serde(with = "humantime_serde")]
pub max_delay: Duration,
pub multiplier: u32,
}
impl Default for RetryConfig {
fn default() -> Self {
Self {
max_attempts: 5,
min_delay: Duration::from_millis(100),
max_delay: Duration::from_secs(2),
multiplier: 2,
}
}
}