use std::path::Path;
use std::time::SystemTime;
use async_trait::async_trait;
use crate::{Result, StorageError, StorageKey, StorageWriteIntent};
#[async_trait]
pub trait Storage: std::fmt::Debug + Send + Sync {
async fn put(
&self,
key: &StorageKey,
content: &[u8],
intent: StorageWriteIntent,
) -> Result<StorageKey>;
async fn put_file(
&self,
key: &StorageKey,
source: &Path,
intent: StorageWriteIntent,
) -> Result<StorageKey>;
async fn promote(
&self,
temporary_key: &StorageKey,
durable_key: &StorageKey,
) -> Result<StorageKey>;
async fn get(&self, key: &StorageKey, intent: StorageWriteIntent) -> Result<Vec<u8>>;
async fn get_to_file(
&self,
key: &StorageKey,
destination: &Path,
intent: StorageWriteIntent,
) -> Result<()>;
async fn exists(&self, key: &StorageKey) -> Result<bool>;
async fn delete(&self, key: &StorageKey) -> Result<()>;
async fn list_prefix(&self, prefix: &StorageKey) -> Result<Vec<StorageKey>>;
async fn delete_prefix_older_than(
&self,
prefix: &StorageKey,
older_than: SystemTime,
) -> Result<u64>;
async fn delete_prefix(&self, prefix: &StorageKey) -> Result<u64> {
let keys = self.list_prefix(prefix).await?;
let mut deleted = 0u64;
for key in keys {
self.delete(&key).await?;
deleted = deleted.checked_add(1).ok_or_else(|| {
StorageError::Internal("deleted object count overflow".to_string())
})?;
}
Ok(deleted)
}
}