use std::path::{Path, PathBuf};
#[derive(Debug, PartialEq)]
pub struct FileEntry {
pub name: String,
pub is_dir: bool,
pub path: PathBuf,
}
pub fn list_directory<P: AsRef<Path>>(path: P) -> std::io::Result<Vec<FileEntry>> {
let mut entries = Vec::new();
for entry in std::fs::read_dir(path)? {
let entry = entry?;
let metadata = entry.metadata()?;
let file_name = entry.file_name().to_string_lossy().to_string();
entries.push(FileEntry {
name: file_name,
is_dir: metadata.is_dir(),
path: entry.path(),
});
}
Ok(entries)
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::tempdir;
#[test]
fn test_list_directory_normal_cases() {
let tmp_dir = tempdir().unwrap();
let base_path = tmp_dir.path();
fs::write(base_path.join("file1.dlt"), b"dummy").unwrap();
fs::write(base_path.join("file2.gz"), b"dummy").unwrap();
fs::create_dir(base_path.join("sub_dir")).unwrap();
let mut entries = list_directory(base_path).unwrap();
entries.sort_by(|a, b| a.name.cmp(&b.name));
assert_eq!(entries.len(), 3);
assert_eq!(entries[0].name, "file1.dlt");
assert!(!entries[0].is_dir);
assert_eq!(entries[1].name, "file2.gz");
assert!(!entries[1].is_dir);
assert_eq!(entries[2].name, "sub_dir");
assert!(entries[2].is_dir);
}
#[test]
fn test_list_directory_not_found() {
let path = Path::new("/path/that/definitely/does/not/exist");
let result = list_directory(path);
assert!(result.is_err());
assert_eq!(result.unwrap_err().kind(), std::io::ErrorKind::NotFound);
}
#[test]
fn test_list_directory_empty() {
let tmp_dir = tempdir().unwrap();
let base_path = tmp_dir.path();
let entries = list_directory(base_path).unwrap();
assert_eq!(entries.len(), 0);
}
}