reinhardt_utils/cache/
cache_trait.rs1use async_trait::async_trait;
4use reinhardt_core::exception::Result;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7use std::time::Duration;
8
9#[async_trait]
11pub trait Cache: Send + Sync {
12 async fn get<T>(&self, key: &str) -> Result<Option<T>>
14 where
15 T: for<'de> Deserialize<'de> + Serialize + Send + Sync;
16
17 async fn set<T>(&self, key: &str, value: &T, ttl: Option<Duration>) -> Result<()>
19 where
20 T: Serialize + Send + Sync;
21
22 async fn delete(&self, key: &str) -> Result<()>;
24
25 async fn has_key(&self, key: &str) -> Result<bool>;
27
28 async fn clear(&self) -> Result<()>;
30
31 async fn get_many<T>(&self, keys: &[&str]) -> Result<HashMap<String, T>>
33 where
34 T: for<'de> Deserialize<'de> + Serialize + Send + Sync,
35 {
36 let mut results = HashMap::new();
37 for key in keys {
38 if let Some(value) = self.get::<T>(key).await? {
39 results.insert(key.to_string(), value);
40 }
41 }
42 Ok(results)
43 }
44
45 async fn set_many<T>(&self, values: HashMap<String, T>, ttl: Option<Duration>) -> Result<()>
47 where
48 T: Serialize + Send + Sync,
49 {
50 for (key, value) in values.iter() {
51 self.set(key, value, ttl).await?;
52 }
53 Ok(())
54 }
55
56 async fn delete_many(&self, keys: &[&str]) -> Result<()> {
58 for key in keys {
59 self.delete(key).await?;
60 }
61 Ok(())
62 }
63
64 async fn incr(&self, key: &str, delta: i64) -> Result<i64> {
72 let current: i64 = self.get(key).await?.unwrap_or(0);
75 let new_value = current + delta;
76 self.set(key, &new_value, None).await?;
77 Ok(new_value)
78 }
79
80 async fn decr(&self, key: &str, delta: i64) -> Result<i64> {
86 self.incr(key, -delta).await
87 }
88}