use std::time::Duration;
use async_trait::async_trait;
use serde::{Serialize, de::DeserializeOwned};
use crate::cache::{CacheKey, CacheResult};
#[async_trait]
pub trait CacheStore: Send + Sync {
async fn get_raw(&self, key: &CacheKey) -> CacheResult<Option<Vec<u8>>>;
async fn set_raw(
&self,
key: &CacheKey,
value: Vec<u8>,
ttl: Option<Duration>,
) -> CacheResult<()>;
async fn delete(&self, key: &CacheKey) -> CacheResult<()>;
async fn delete_many(&self, keys: &[CacheKey]) -> CacheResult<()> {
for key in keys {
self.delete(key).await?;
}
Ok(())
}
async fn get_json<T>(&self, key: &CacheKey) -> CacheResult<Option<T>>
where
T: DeserializeOwned + Send,
{
match self.get_raw(key).await? {
Some(bytes) => Ok(Some(serde_json::from_slice(&bytes)?)),
None => Ok(None),
}
}
async fn set_json<T>(&self, key: &CacheKey, value: &T, ttl: Option<Duration>) -> CacheResult<()>
where
T: Serialize + Sync,
{
self.set_raw(key, serde_json::to_vec(value)?, ttl).await
}
}