use async_trait::async_trait;
use serde::de::DeserializeOwned;
use serde::Serialize;
use std::time::Duration;
use crate::CacheError;
#[async_trait]
pub trait Cache: Send + Sync {
async fn get<T>(&self, key: &str) -> Result<Option<T>, CacheError>
where
T: DeserializeOwned;
async fn set<T>(&self, key: &str, value: &T, ttl: Option<Duration>) -> Result<(), CacheError>
where
T: Serialize + Sync;
async fn delete(&self, key: &str) -> Result<bool, CacheError>;
async fn exists(&self, key: &str) -> Result<bool, CacheError>;
async fn expire(&self, key: &str, ttl: Duration) -> Result<bool, CacheError>;
async fn ttl(&self, key: &str) -> Result<Option<Duration>, CacheError>;
async fn clear(&self) -> Result<u64, CacheError>;
async fn clear_module(&self, module: &str) -> Result<u64, CacheError>;
}