use std::io;
use std::path::PathBuf;
pub fn get_num_files(path_buf: &PathBuf) -> io::Result<usize> {
let mut count: usize = 0;
let items = path_buf.read_dir()?;
for item in items {
if item?.path().is_file() {
count += 1;
}
}
Ok(count)
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs::{create_dir, create_dir_all, remove_dir_all, remove_file, File};
#[test]
fn get_num_files_flat_dir() {
let path_buf = PathBuf::from("./get_num_files_flat_dir_test/");
let test_vec: Vec<PathBuf> = Vec::from([
PathBuf::from("./get_num_files_flat_dir_test/1.txt"),
PathBuf::from("./get_num_files_flat_dir_test/2.txt"),
PathBuf::from("./get_num_files_flat_dir_test/3.txt"),
]);
create_dir(&path_buf).unwrap();
for file in &test_vec {
File::create(file).unwrap();
}
let test_result: usize = get_num_files(&path_buf).unwrap();
remove_dir_all(path_buf).unwrap();
assert_eq!(test_result, test_vec.len());
}
#[test]
fn get_num_files_nested_dir() {
let path_buf = PathBuf::from("./get_num_files_nest_dir_test/");
let nested_path_buf = path_buf.join("nested/");
let test_vec: Vec<PathBuf> = Vec::from([
PathBuf::from("./get_num_files_nest_dir_test/1.txt"),
PathBuf::from("./get_num_files_nest_dir_test/2.txt"),
PathBuf::from("./get_num_files_nest_dir_test/3.txt"),
PathBuf::from("./get_num_files_nest_dir_test/nested/4.txt"),
]);
create_dir_all(&nested_path_buf).unwrap();
for file in &test_vec {
File::create(file).unwrap();
}
let test_result: usize = get_num_files(&path_buf).unwrap();
remove_dir_all(path_buf).unwrap();
assert_eq!(test_result, test_vec.len() - 1);
}
#[test]
fn get_num_files_invalid_dir() {
let path_buf = PathBuf::from("./get_num_files_not_a_dir.txt");
File::create(&path_buf).unwrap();
let test_result = get_num_files(&path_buf);
remove_file(path_buf).unwrap();
assert!(test_result.is_err())
}
#[test]
fn get_num_files_empty_dir() {
let path_buf = PathBuf::from("./get_num_files_empty_dir_test/");
create_dir(&path_buf).unwrap();
let test_result: usize = get_num_files(&path_buf).unwrap();
remove_dir_all(path_buf).unwrap();
assert_eq!(test_result, 0);
}
}