Skip to main content

oxcache/traits/
cache_key.rs

1// Copyright (c) 2025-2026 Kirky.X
2// SPDX-License-Identifier: MIT
3//! CacheKey trait for converting types to cache key strings
4
5/// Trait for types that can be used as cache keys
6///
7/// This trait provides a way to convert any type into a string representation
8/// suitable for use as a cache key. Blanket implementations are provided for
9/// common types like String, &str, and numeric types.
10///
11/// # Example
12///
13/// ```rust,ignore
14/// use oxcache::traits::CacheKey;
15///
16/// // Using blanket implementation for String
17/// let key: String = "user:123".to_string();
18/// assert_eq!(key.to_key_string(), "user:123");
19///
20/// // Using blanket implementation for u64
21/// let id: u64 = 12345;
22/// assert_eq!(id.to_key_string(), "12345");
23///
24/// // Custom implementation
25/// struct UserId(u64);
26///
27/// impl CacheKey for UserId {
28///     fn to_key_string(&self) -> String {
29///         format!("user:{}", self.0)
30///     }
31/// }
32///
33/// let user_id = UserId(12345);
34/// assert_eq!(user_id.to_key_string(), "user:12345");
35/// ```
36pub trait CacheKey: Send + Sync {
37    /// Convert this key to a string representation
38    ///
39    /// This method should return a unique string representation that can be
40    /// used as a cache key. The implementation should be deterministic and
41    /// produce the same output for equal values.
42    ///
43    /// # Returns
44    ///
45    /// A string representation of this key
46    fn to_key_string(&self) -> String;
47}
48
49// Blanket implementations for common types
50
51impl CacheKey for String {
52    fn to_key_string(&self) -> String {
53        self.clone()
54    }
55}
56
57impl CacheKey for &str {
58    fn to_key_string(&self) -> String {
59        (*self).to_string()
60    }
61}
62
63impl CacheKey for u64 {
64    fn to_key_string(&self) -> String {
65        self.to_string()
66    }
67}
68
69impl CacheKey for u128 {
70    fn to_key_string(&self) -> String {
71        self.to_string()
72    }
73}
74
75impl CacheKey for i64 {
76    fn to_key_string(&self) -> String {
77        self.to_string()
78    }
79}
80
81impl CacheKey for i32 {
82    fn to_key_string(&self) -> String {
83        self.to_string()
84    }
85}
86
87impl CacheKey for u32 {
88    fn to_key_string(&self) -> String {
89        self.to_string()
90    }
91}
92
93impl CacheKey for usize {
94    fn to_key_string(&self) -> String {
95        self.to_string()
96    }
97}
98
99impl CacheKey for isize {
100    fn to_key_string(&self) -> String {
101        self.to_string()
102    }
103}
104
105#[cfg(test)]
106mod tests {
107    use super::*;
108
109    #[test]
110    fn test_string_key() {
111        let key = "user:123".to_string();
112        assert_eq!(key.to_key_string(), "user:123");
113    }
114
115    #[test]
116    fn test_str_key() {
117        let key: &str = "user:123";
118        assert_eq!(key.to_key_string(), "user:123");
119    }
120
121    #[test]
122    fn test_u64_key() {
123        let key: u64 = 12345;
124        assert_eq!(key.to_key_string(), "12345");
125    }
126
127    #[test]
128    fn test_i64_key() {
129        let key: i64 = -12345;
130        assert_eq!(key.to_key_string(), "-12345");
131    }
132
133    #[test]
134    fn test_u128_key() {
135        let key: u128 = 12345678901234567890;
136        assert_eq!(key.to_key_string(), "12345678901234567890");
137    }
138
139    #[test]
140    fn test_i32_key() {
141        // 测试 i32 类型的 CacheKey 实现 (lines 84-85)
142        let key: i32 = 42;
143        assert_eq!(key.to_key_string(), "42");
144    }
145
146    #[test]
147    fn test_i32_negative_key() {
148        let key: i32 = -99;
149        assert_eq!(key.to_key_string(), "-99");
150    }
151
152    #[test]
153    fn test_i32_max_key() {
154        let key: i32 = i32::MAX;
155        assert_eq!(key.to_key_string(), "2147483647");
156    }
157
158    #[test]
159    fn test_i32_min_key() {
160        let key: i32 = i32::MIN;
161        assert_eq!(key.to_key_string(), "-2147483648");
162    }
163
164    #[test]
165    fn test_u32_key() {
166        // 测试 u32 类型的 CacheKey 实现 (lines 90-91)
167        let key: u32 = 100;
168        assert_eq!(key.to_key_string(), "100");
169    }
170
171    #[test]
172    fn test_u32_max_key() {
173        let key: u32 = u32::MAX;
174        assert_eq!(key.to_key_string(), "4294967295");
175    }
176
177    #[test]
178    fn test_u32_zero_key() {
179        let key: u32 = 0;
180        assert_eq!(key.to_key_string(), "0");
181    }
182
183    #[test]
184    fn test_usize_key() {
185        // 测试 usize 类型的 CacheKey 实现 (lines 96-97)
186        let key: usize = 1000;
187        assert_eq!(key.to_key_string(), "1000");
188    }
189
190    #[test]
191    fn test_usize_zero_key() {
192        let key: usize = 0;
193        assert_eq!(key.to_key_string(), "0");
194    }
195
196    #[test]
197    fn test_usize_max_key() {
198        let key: usize = usize::MAX;
199        assert_eq!(key.to_key_string(), usize::MAX.to_string());
200    }
201
202    #[test]
203    fn test_isize_key() {
204        // 测试 isize 类型的 CacheKey 实现 (lines 102-103)
205        let key: isize = -500;
206        assert_eq!(key.to_key_string(), "-500");
207    }
208
209    #[test]
210    fn test_isize_positive_key() {
211        let key: isize = 500;
212        assert_eq!(key.to_key_string(), "500");
213    }
214
215    #[test]
216    fn test_isize_max_key() {
217        let key: isize = isize::MAX;
218        assert_eq!(key.to_key_string(), isize::MAX.to_string());
219    }
220
221    #[test]
222    fn test_isize_min_key() {
223        let key: isize = isize::MIN;
224        assert_eq!(key.to_key_string(), isize::MIN.to_string());
225    }
226
227    #[test]
228    fn test_string_empty_key() {
229        let key: String = String::new();
230        assert_eq!(key.to_key_string(), "");
231    }
232
233    #[test]
234    fn test_str_empty_key() {
235        let key: &str = "";
236        assert_eq!(key.to_key_string(), "");
237    }
238
239    #[test]
240    fn test_u64_zero_key() {
241        let key: u64 = 0;
242        assert_eq!(key.to_key_string(), "0");
243    }
244
245    #[test]
246    fn test_u64_max_key() {
247        let key: u64 = u64::MAX;
248        assert_eq!(key.to_key_string(), u64::MAX.to_string());
249    }
250
251    #[test]
252    fn test_custom_cache_key_impl() {
253        struct UserId(u64);
254
255        impl CacheKey for UserId {
256            fn to_key_string(&self) -> String {
257                format!("user:{}", self.0)
258            }
259        }
260
261        let user_id = UserId(12345);
262        assert_eq!(user_id.to_key_string(), "user:12345");
263    }
264}