reinhardt_utils/cache/key_builder.rs
1//! Cache key builder for generating cache keys
2
3/// Cache key builder for generating cache keys
4#[derive(Clone)]
5pub struct CacheKeyBuilder {
6 prefix: String,
7 version: u32,
8}
9
10impl CacheKeyBuilder {
11 /// Create a new cache key builder with the given prefix
12 ///
13 /// # Examples
14 ///
15 /// ```
16 /// use reinhardt_utils::cache::CacheKeyBuilder;
17 ///
18 /// let builder = CacheKeyBuilder::new("myapp");
19 /// assert_eq!(builder.build("user"), "myapp:1:user");
20 /// ```
21 pub fn new(prefix: impl Into<String>) -> Self {
22 Self {
23 prefix: prefix.into(),
24 version: 1,
25 }
26 }
27 /// Set the version for cache key namespacing
28 ///
29 /// # Examples
30 ///
31 /// ```
32 /// use reinhardt_utils::cache::CacheKeyBuilder;
33 ///
34 /// let builder = CacheKeyBuilder::new("myapp").with_version(2);
35 /// assert_eq!(builder.build("user"), "myapp:2:user");
36 /// ```
37 pub fn with_version(mut self, version: u32) -> Self {
38 self.version = version;
39 self
40 }
41 /// Build a cache key with prefix and version
42 ///
43 /// # Examples
44 ///
45 /// ```
46 /// use reinhardt_utils::cache::CacheKeyBuilder;
47 ///
48 /// let builder = CacheKeyBuilder::new("app").with_version(3);
49 /// let key = builder.build("user:123");
50 /// assert_eq!(key, "app:3:user:123");
51 /// ```
52 pub fn build(&self, key: &str) -> String {
53 format!("{}:{}:{}", self.prefix, self.version, key)
54 }
55 /// Build multiple cache keys at once
56 ///
57 /// # Examples
58 ///
59 /// ```
60 /// use reinhardt_utils::cache::CacheKeyBuilder;
61 ///
62 /// let builder = CacheKeyBuilder::new("app");
63 /// let keys = builder.build_many(&["user", "session", "token"]);
64 /// assert_eq!(keys, vec!["app:1:user", "app:1:session", "app:1:token"]);
65 /// ```
66 pub fn build_many(&self, keys: &[&str]) -> Vec<String> {
67 keys.iter().map(|k| self.build(k)).collect()
68 }
69}
70
71impl Default for CacheKeyBuilder {
72 fn default() -> Self {
73 Self::new("app")
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[tokio::test]
82 async fn test_cache_key_builder() {
83 let builder = CacheKeyBuilder::new("myapp").with_version(2);
84
85 assert_eq!(builder.build("user:123"), "myapp:2:user:123");
86
87 let keys = builder.build_many(&["key1", "key2"]);
88 assert_eq!(keys, vec!["myapp:2:key1", "myapp:2:key2"]);
89 }
90}