use serde::Deserialize; use url::Url; #[derive(Debug, Clone, Deserialize)] #[serde(rename_all = "lowercase")] pub struct CacheConfig { #[serde(rename = "dsn")] pub redis_dsn: Url, #[serde(default)] pub pooled: bool, #[serde(rename = "type")] pub kind: RedisVariant, #[serde(default = "default_max_conns")] #[serde(rename = "max-connections")] pub max_connections: u16, } #[derive(Debug, Deserialize, Clone, Default)] #[serde(rename_all = "kebab-case")] pub enum RedisVariant { Clustered, #[default] NonClustered, Sentinel(SentinelConfig), } #[derive(Clone, Debug, Deserialize, Eq, PartialEq)] pub struct SentinelConfig { #[serde(rename = "sentinel_service_name")] pub service_name: String, #[serde(default)] pub redis_tls_mode_secure: bool, pub redis_db: Option, pub redis_username: Option, pub redis_password: Option, #[serde(default)] pub redis_use_resp3: bool, } fn default_max_conns() -> u16 { 100 } fn default_cache() -> Url { Url::parse("redis://localhost:6379").expect("valid default DATABASE url") } impl Default for CacheConfig { fn default() -> Self { Self { redis_dsn: default_cache(), pooled: Default::default(), kind: Default::default(), max_connections: default_max_conns(), } } }