use futures::StreamExt;
use slatedb::object_store::{ObjectStore, path::Path};
use super::config::{SlateDbStorageConfig, StorageConfig};
use super::factory::create_object_store;
use super::{StorageError, StorageResult};
pub async fn delete(config: &StorageConfig) -> StorageResult<()> {
match config {
StorageConfig::InMemory => {
Ok(())
}
StorageConfig::SlateDb(slate_config) => delete_slatedb(slate_config).await,
}
}
pub async fn delete_slatedb(config: &SlateDbStorageConfig) -> StorageResult<()> {
let object_store = create_object_store(&config.object_store)?;
let prefix = Path::from(config.path.as_str());
delete_prefix(&*object_store, &prefix).await
}
pub async fn delete_prefix(object_store: &dyn ObjectStore, prefix: &Path) -> StorageResult<()> {
let mut list_stream = object_store.list(Some(prefix));
while let Some(result) = list_stream.next().await {
let meta =
result.map_err(|e| StorageError::Storage(format!("Failed to list objects: {}", e)))?;
object_store.delete(&meta.location).await.map_err(|e| {
StorageError::Storage(format!(
"Failed to delete object {:?}: {}",
meta.location, e
))
})?;
}
Ok(())
}