Skip to main content

rskit_cache/
config.rs

1use serde::{Deserialize, Serialize};
2
3/// Cache store selection and common key settings.
4#[derive(Debug, Clone, Deserialize, Serialize)]
5pub struct CacheConfig {
6    /// Store name looked up in an injected [`crate::CacheRegistry`].
7    #[serde(default = "default_store", alias = "backend")]
8    pub store: String,
9    /// Optional prefix prepended to every key by stores that support it.
10    pub key_prefix: Option<String>,
11    /// In-memory store options.
12    #[serde(default)]
13    pub memory: MemoryConfig,
14}
15
16impl Default for CacheConfig {
17    fn default() -> Self {
18        Self {
19            store: default_store(),
20            key_prefix: None,
21            memory: MemoryConfig::default(),
22        }
23    }
24}
25
26fn default_store() -> String {
27    "memory".to_owned()
28}
29
30/// In-memory cache configuration.
31#[derive(Debug, Clone, Default, Deserialize, Serialize)]
32pub struct MemoryConfig {
33    /// Optional maximum entry count. `Some(0)` is normalized to unbounded by the memory store.
34    pub max_entries: Option<usize>,
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn default_config_has_expected_values() {
43        let cfg = CacheConfig::default();
44        assert_eq!(cfg.store, "memory");
45        assert!(cfg.key_prefix.is_none());
46        assert!(cfg.memory.max_entries.is_none());
47    }
48
49    #[test]
50    fn deserialise_from_json() {
51        let json = r#"{"store":"memory","memory":{"max_entries":2}}"#;
52        let cfg: CacheConfig = serde_json::from_str(json).unwrap();
53        assert_eq!(cfg.store, "memory");
54        assert_eq!(cfg.memory.max_entries, Some(2));
55    }
56
57    #[test]
58    fn deserialise_legacy_backend_field_from_json() {
59        let json = r#"{"backend":"memory","memory":{"max_entries":2}}"#;
60        let cfg: CacheConfig = serde_json::from_str(json).unwrap();
61        assert_eq!(cfg.store, "memory");
62        assert_eq!(cfg.memory.max_entries, Some(2));
63    }
64}