Skip to main content

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}