1use std::time::Duration;
2
3use async_trait::async_trait;
4use serde::{Serialize, de::DeserializeOwned};
5
6use crate::cache::{CacheKey, CacheResult};
7
8#[async_trait]
10pub trait CacheStore: Send + Sync {
11 async fn get_raw(&self, key: &CacheKey) -> CacheResult<Option<Vec<u8>>>;
13
14 async fn set_raw(
16 &self,
17 key: &CacheKey,
18 value: Vec<u8>,
19 ttl: Option<Duration>,
20 ) -> CacheResult<()>;
21
22 async fn delete(&self, key: &CacheKey) -> CacheResult<()>;
24
25 async fn delete_many(&self, keys: &[CacheKey]) -> CacheResult<()> {
30 for key in keys {
31 self.delete(key).await?;
32 }
33 Ok(())
34 }
35
36 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 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}