Skip to main content

rs_zero/cache/
store.rs

1use std::time::Duration;
2
3use async_trait::async_trait;
4use serde::{Serialize, de::DeserializeOwned};
5
6use crate::cache::{CacheKey, CacheResult};
7
8/// Async cache store abstraction.
9#[async_trait]
10pub trait CacheStore: Send + Sync {
11    /// Reads a raw value by key.
12    async fn get_raw(&self, key: &CacheKey) -> CacheResult<Option<Vec<u8>>>;
13
14    /// Writes a raw value with optional TTL.
15    async fn set_raw(
16        &self,
17        key: &CacheKey,
18        value: Vec<u8>,
19        ttl: Option<Duration>,
20    ) -> CacheResult<()>;
21
22    /// Deletes a value by key.
23    async fn delete(&self, key: &CacheKey) -> CacheResult<()>;
24
25    /// Deletes multiple values by key.
26    ///
27    /// Backends can override this to batch keys by connection or shard. The
28    /// default implementation preserves existing single-key semantics.
29    async fn delete_many(&self, keys: &[CacheKey]) -> CacheResult<()> {
30        for key in keys {
31            self.delete(key).await?;
32        }
33        Ok(())
34    }
35
36    /// Reads a JSON value by key.
37    async fn get_json<T>(&self, key: &CacheKey) -> CacheResult<Option<T>>
38    where
39        T: DeserializeOwned + Send,
40    {
41        match self.get_raw(key).await? {
42            Some(bytes) => Ok(Some(serde_json::from_slice(&bytes)?)),
43            None => Ok(None),
44        }
45    }
46
47    /// Writes a JSON value with optional TTL.
48    async fn set_json<T>(&self, key: &CacheKey, value: &T, ttl: Option<Duration>) -> CacheResult<()>
49    where
50        T: Serialize + Sync,
51    {
52        self.set_raw(key, serde_json::to_vec(value)?, ttl).await
53    }
54}