use std::fs;
use std::path::Path;
use ssri::Integrity;
use crate::content::rm;
use crate::errors::{IoErrorExt, Result};
use crate::index;
#[cfg(any(feature = "async-std", feature = "tokio"))]
pub async fn remove<P, K>(cache: P, key: K) -> Result<()>
where
P: AsRef<Path>,
K: AsRef<str>,
{
index::delete_async(cache.as_ref(), key.as_ref()).await
}
#[cfg(any(feature = "async-std", feature = "tokio"))]
pub async fn remove_hash<P: AsRef<Path>>(cache: P, sri: &Integrity) -> Result<()> {
rm::rm_async(cache.as_ref(), sri).await
}
#[cfg(any(feature = "async-std", feature = "tokio"))]
pub async fn clear<P: AsRef<Path>>(cache: P) -> Result<()> {
async fn inner(cache: &Path) -> Result<()> {
for entry in cache
.read_dir()
.with_context(|| {
format!(
"Failed to read directory contents while clearing cache, at {}",
cache.display()
)
})?
.flatten()
{
crate::async_lib::remove_dir_all(entry.path())
.await
.with_context(|| format!("Failed to clear cache at {}", cache.display()))?;
}
Ok(())
}
inner(cache.as_ref()).await
}
pub fn remove_sync<P, K>(cache: P, key: K) -> Result<()>
where
P: AsRef<Path>,
K: AsRef<str>,
{
index::delete(cache.as_ref(), key.as_ref())
}
pub fn remove_hash_sync<P: AsRef<Path>>(cache: P, sri: &Integrity) -> Result<()> {
rm::rm(cache.as_ref(), sri)
}
pub fn clear_sync<P: AsRef<Path>>(cache: P) -> Result<()> {
fn inner(cache: &Path) -> Result<()> {
for entry in cache
.read_dir()
.with_context(|| {
format!(
"Failed to read directory contents while clearing cache, at {}",
cache.display()
)
})?
.flatten()
{
fs::remove_dir_all(entry.path())
.with_context(|| format!("Failed to clear cache at {}", cache.display()))?;
}
Ok(())
}
inner(cache.as_ref())
}
#[cfg(test)]
mod tests {
#[cfg(feature = "async-std")]
use async_attributes::test as async_test;
#[cfg(feature = "tokio")]
use tokio::test as async_test;
#[cfg(any(feature = "async-std", feature = "tokio"))]
#[async_test]
async fn test_remove() {
futures::executor::block_on(async {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path().to_owned();
let sri = crate::write(&dir, "key", b"my-data").await.unwrap();
crate::remove(&dir, "key").await.unwrap();
let entry = crate::metadata(&dir, "key").await.unwrap();
assert_eq!(entry, None);
let data_exists = crate::exists(&dir, &sri).await;
assert!(data_exists);
});
}
#[cfg(any(feature = "async-std", feature = "tokio"))]
#[async_test]
async fn test_remove_data() {
futures::executor::block_on(async {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path().to_owned();
let sri = crate::write(&dir, "key", b"my-data").await.unwrap();
crate::remove_hash(&dir, &sri).await.unwrap();
let entry = crate::metadata(&dir, "key").await.unwrap();
assert!(entry.is_some());
let data_exists = crate::exists(&dir, &sri).await;
assert!(!data_exists);
});
}
#[cfg(any(feature = "async-std", feature = "tokio"))]
#[async_test]
async fn test_clear() {
futures::executor::block_on(async {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path().to_owned();
let sri = crate::write(&dir, "key", b"my-data").await.unwrap();
crate::clear(&dir).await.unwrap();
let entry = crate::metadata(&dir, "key").await.unwrap();
assert!(entry.is_none());
let data_exists = crate::exists(&dir, &sri).await;
assert!(!data_exists);
});
}
#[test]
fn test_remove_sync() {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path().to_owned();
let sri = crate::write_sync(&dir, "key", b"my-data").unwrap();
crate::remove_sync(&dir, "key").unwrap();
let new_entry = crate::metadata_sync(&dir, "key").unwrap();
assert!(new_entry.is_none());
let data_exists = crate::exists_sync(&dir, &sri);
assert!(data_exists);
}
#[test]
fn test_remove_data_sync() {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path().to_owned();
let sri = crate::write_sync(&dir, "key", b"my-data").unwrap();
crate::remove_hash_sync(&dir, &sri).unwrap();
let entry = crate::metadata_sync(&dir, "key").unwrap();
assert!(entry.is_some());
let data_exists = crate::exists_sync(&dir, &sri);
assert!(!data_exists);
}
#[test]
fn test_clear_sync() {
let tmp = tempfile::tempdir().unwrap();
let dir = tmp.path().to_owned();
let sri = crate::write_sync(&dir, "key", b"my-data").unwrap();
crate::clear_sync(&dir).unwrap();
let entry = crate::metadata_sync(&dir, "key").unwrap();
assert_eq!(entry, None);
let data_exists = crate::exists_sync(&dir, &sri);
assert!(!data_exists);
}
}