Fixed recursion using a BoxFuture.
This commit is contained in:
		
							parent
							
								
									98fa43575d
								
							
						
					
					
						commit
						ae3add9c81
					
				| @ -1,26 +1,31 @@ | ||||
| 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) async fn walk_fs<P: AsRef<Path>>( | ||||
| pub(crate) fn walk_fs<P: AsRef<Path> + std::marker::Send + 'static>( | ||||
|     root: P, | ||||
|     predicate: fn(&DirEntry) -> Result<bool, CustomError>, | ||||
| ) -> Result<Vec<DirEntry>, CustomError> { | ||||
|     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); | ||||
| ) -> BoxFuture<'static, Result<Vec<DirEntry>, 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); | ||||
|             } | ||||
|         } | ||||
|         if predicate(&entry)? { | ||||
|             ret.push(entry); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     Ok(ret) | ||||
|         Ok(ret) | ||||
|     } | ||||
|     .boxed() | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Tom Alexander
						Tom Alexander