use std::ops::AsyncFn; use std::path::Path; use futures::future::BoxFuture; use futures::FutureExt; use tokio::fs::DirEntry; use crate::error::CustomError; pub(crate) fn walk_fs<'p, P: AsRef + std::marker::Send + 'p>( root: P, predicate: fn(&DirEntry) -> Result, ) -> BoxFuture<'p, Result, CustomError>> { 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); } if predicate(&entry)? { ret.push(entry); } } Ok(ret) } .boxed() }