natter/src/command/build/walk_fs.rs

36 lines
994 B
Rust
Raw Normal View History

2024-10-18 21:29:15 -04:00
use std::future::Future;
use std::ops::AsyncFn;
use std::path::Path;
2024-10-18 21:22:39 -04:00
use futures::future::BoxFuture;
use futures::FutureExt;
use tokio::fs::DirEntry;
use crate::error::CustomError;
pub(crate) fn walk_fs<'p, P: AsRef<Path> + std::marker::Send + 'p>(
root: P,
2024-10-18 21:29:15 -04:00
predicate: impl AsyncFn(&DirEntry) -> Result<bool, CustomError>
+ std::marker::Send
+ 'p
+ std::marker::Copy,
) -> BoxFuture<'p, Result<Vec<DirEntry>, CustomError>> {
2024-10-18 21:22:39 -04:00
async move {
let mut ret = Vec::new();
let mut entries = tokio::fs::read_dir(root).await?;
while let Some(entry) = entries.next_entry().await? {
let file_type = entry.file_type().await?;
if file_type.is_dir() {
let child_entries = walk_fs(entry.path(), predicate).await?;
ret.extend(child_entries);
}
2024-10-18 21:29:15 -04:00
if predicate(&entry).await? {
2024-10-18 21:22:39 -04:00
ret.push(entry);
}
}
2024-10-18 21:22:39 -04:00
Ok(ret)
}
.boxed()
}