use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CacheConfig {
#[serde(default = "default_max_capacity")]
pub max_capacity: u64,
#[serde(default = "default_ttl_secs")]
pub default_ttl_secs: u64,
#[serde(default)]
pub source_ttls: HashMap<String, u64>,
}
fn default_max_capacity() -> u64 {
10_000
}
fn default_ttl_secs() -> u64 {
3600
}
impl Default for CacheConfig {
fn default() -> Self {
Self {
max_capacity: default_max_capacity(),
default_ttl_secs: default_ttl_secs(),
source_ttls: HashMap::new(),
}
}
}
impl CacheConfig {
#[must_use]
pub fn from_cascade() -> Self {
#[cfg(feature = "config")]
{
if let Some(cfg) = crate::config::try_get()
&& let Ok(cc) = cfg.unmarshal_key_registered::<Self>("cache")
{
return cc;
}
}
Self::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_are_sensible() {
let config = CacheConfig::default();
assert_eq!(config.max_capacity, 10_000);
assert_eq!(config.default_ttl_secs, 3600);
assert!(config.source_ttls.is_empty());
}
#[test]
fn deserialise_with_source_ttls() {
let yaml = r"
max_capacity: 5000
default_ttl_secs: 1800
source_ttls:
http: 86400
db: 900
";
let config: CacheConfig = serde_yaml_ng::from_str(yaml).unwrap();
assert_eq!(config.max_capacity, 5000);
assert_eq!(config.default_ttl_secs, 1800);
assert_eq!(config.source_ttls["http"], 86400);
assert_eq!(config.source_ttls["db"], 900);
}
}