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    /// Reads a JSON value by key.
26    async fn get_json<T>(&self, key: &CacheKey) -> CacheResult<Option<T>>
27    where
28        T: DeserializeOwned + Send,
29    {
30        match self.get_raw(key).await? {
31            Some(bytes) => Ok(Some(serde_json::from_slice(&bytes)?)),
32            None => Ok(None),
33        }
34    }
35
36    /// Writes a JSON value with optional TTL.
37    async fn set_json<T>(&self, key: &CacheKey, value: &T, ttl: Option<Duration>) -> CacheResult<()>
38    where
39        T: Serialize + Sync,
40    {
41        self.set_raw(key, serde_json::to_vec(value)?, ttl).await
42    }
43}