use std::fs::{read_dir, ReadDir};
use std::io;
use std::path::PathBuf;
pub fn collect_files<'a>(
path_buf: &PathBuf,
vec: &'a mut Vec<PathBuf>,
) -> io::Result<&'a mut Vec<PathBuf>> {
let items: ReadDir = read_dir(path_buf)?;
for item in items {
let item = item?.path();
if item.is_dir() {
collect_files(&item, vec)?;
} else {
vec.push(item)
}
}
Ok(vec)
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs::{create_dir, create_dir_all, remove_dir_all, remove_file, File};
#[test]
fn collect_files_invalid_dir() {
let mut vec: Vec<PathBuf> = Vec::new();
let path_buf = PathBuf::from("./collect_files_not_a_dir.txt");
File::create(&path_buf).unwrap();
let test_result = collect_files(&path_buf, &mut vec);
remove_file(path_buf).unwrap();
assert!(test_result.is_err())
}
#[test]
fn collect_files_flat_dir() {
let mut vec: Vec<PathBuf> = Vec::new();
let path_buf = PathBuf::from("./collect_files_flat_dir_test/");
let test_vec: Vec<PathBuf> = Vec::from([
PathBuf::from("./collect_files_flat_dir_test/1.txt"),
PathBuf::from("./collect_files_flat_dir_test/2.txt"),
PathBuf::from("./collect_files_flat_dir_test/3.txt"),
]);
create_dir(&path_buf).unwrap();
for file in &test_vec {
File::create(file).unwrap();
}
let test_result: &mut Vec<PathBuf> = collect_files(&path_buf, &mut vec).unwrap();
test_result.sort();
remove_dir_all(path_buf).unwrap();
assert_eq!(test_result, &test_vec);
}
#[test]
fn collect_files_nested_dir() {
let mut vec: Vec<PathBuf> = Vec::new();
let path_buf = PathBuf::from("./collect_files_nest_dir_test/");
let nested_dir_path_buf = PathBuf::from("./collect_files_nest_dir_test/nested_dir/");
let test_vec: Vec<PathBuf> = Vec::from([
PathBuf::from("./collect_files_nest_dir_test/1.txt"),
PathBuf::from("./collect_files_nest_dir_test/2.txt"),
PathBuf::from("./collect_files_nest_dir_test/3.txt"),
PathBuf::from("./collect_files_nest_dir_test/nested_dir/1.txt"),
PathBuf::from("./collect_files_nest_dir_test/nested_dir/2.txt"),
PathBuf::from("./collect_files_nest_dir_test/nested_dir/3.txt"),
]);
create_dir_all(&nested_dir_path_buf).unwrap();
for file in &test_vec {
File::create(file).unwrap();
}
let test_result: &mut Vec<PathBuf> = collect_files(&path_buf, &mut vec).unwrap();
test_result.sort();
remove_dir_all(path_buf).unwrap();
assert_eq!(test_result, &test_vec);
}
}