use std::time::Duration;
use async_trait::async_trait;
use super::key::CacheKey;
#[non_exhaustive]
#[derive(Debug, thiserror::Error)]
pub enum CacheError {
#[error("cache serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("cache backend error: {0}")]
Backend(Box<dyn std::error::Error + Send + Sync>),
}
#[async_trait]
pub trait CacheBackend: Send + Sync + 'static {
async fn get(&self, key: &CacheKey) -> Result<Option<serde_json::Value>, CacheError>;
async fn set(
&self,
key: CacheKey,
value: serde_json::Value,
ttl: Duration,
) -> Result<(), CacheError>;
async fn invalidate(&self, key: &CacheKey) -> Result<(), CacheError>;
async fn clear(&self) -> Result<(), CacheError>;
}