fs.rs

 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}