1use async_trait::async_trait;
2use chrono::{DateTime, Utc};
3use thiserror::Error;
4
5#[derive(Debug, Error)]
6pub enum StorageError {
7 #[error("backend error: {0}")]
8 Backend(String),
9 #[error("not found")]
10 NotFound,
11}
12
13pub type StorageResult<T> = Result<T, StorageError>;
14
15#[derive(Debug, Clone)]
16pub struct StorageEntry {
17 pub value: Vec<u8>,
18 pub expires_at: Option<DateTime<Utc>>,
19}
20
21#[async_trait]
22pub trait StorageBackend: Send + Sync {
23 async fn get(&self, path: &str) -> StorageResult<Option<StorageEntry>>;
24 async fn put(&self, path: &str, entry: StorageEntry) -> StorageResult<()>;
25 async fn delete(&self, path: &str) -> StorageResult<()>;
26 async fn list(&self, prefix: &str) -> StorageResult<Vec<String>>;
27}