use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum RedisMode {
Standalone,
Sentinel,
Cluster,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisNode {
pub host: String,
pub port: u16,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisSentinel {
pub master_name: String,
pub nodes: Vec<RedisNode>,
pub password: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisCluster {
pub nodes: Vec<RedisNode>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PoolConfig {
pub max_connections: usize,
pub min_connections: u32,
pub connection_timeout: u64,
pub idle_timeout: u64,
}
impl Default for PoolConfig {
fn default() -> Self {
Self {
max_connections: 10,
min_connections: 1,
connection_timeout: 10,
idle_timeout: 60,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedisConfig {
pub mode: RedisMode,
pub node: Option<RedisNode>,
pub sentinel: Option<RedisSentinel>,
pub cluster: Option<RedisCluster>,
pub pool: PoolConfig,
pub password: Option<String>,
pub database: Option<u8>,
}
impl RedisConfig {
pub fn validate(&self) -> crate::redis::Result<()> {
match self.mode {
RedisMode::Standalone => {
if self.node.is_none() {
return Err(crate::redis::RedisError::Config(
"Standalone mode requires node configuration".to_string(),
));
}
}
RedisMode::Sentinel => {
if self.sentinel.is_none() {
return Err(crate::redis::RedisError::Config(
"Sentinel mode requires sentinel configuration".to_string(),
));
}
}
RedisMode::Cluster => {
if self.cluster.is_none() {
return Err(crate::redis::RedisError::Config(
"Cluster mode requires cluster configuration".to_string(),
));
}
}
}
Ok(())
}
}