1use std::path::Path;
2
3use crate::ResultExt;
4use async_fs as fs;
5use futures_lite::StreamExt;
6
7/// Removes all files and directories matching the given predicate
8pub async fn remove_matching<F>(dir: &Path, predicate: F)
9where
10 F: Fn(&Path) -> bool,
11{
12 if let Some(mut entries) = fs::read_dir(dir).await.log_err() {
13 while let Some(entry) = entries.next().await {
14 if let Some(entry) = entry.log_err() {
15 let entry_path = entry.path();
16 if predicate(entry_path.as_path()) {
17 if let Ok(metadata) = fs::metadata(&entry_path).await {
18 if metadata.is_file() {
19 fs::remove_file(&entry_path).await.log_err();
20 } else {
21 fs::remove_dir_all(&entry_path).await.log_err();
22 }
23 }
24 }
25 }
26 }
27 }
28}