52 lines
1.3 KiB
Rust
52 lines
1.3 KiB
Rust
use crate::{Entry, EntryReadError, EntryType};
|
|
use std::path::Path;
|
|
|
|
pub fn get_entry<P>(path: P) -> Result<Entry, EntryReadError>
|
|
where
|
|
P: AsRef<Path>,
|
|
{
|
|
Entry::from_path(path)
|
|
}
|
|
|
|
pub fn get_optional_entry<P>(path: P) -> Result<Option<Entry>, EntryReadError>
|
|
where
|
|
P: AsRef<Path>,
|
|
{
|
|
match get_entry(path) {
|
|
Ok(e) => Ok(Some(e)),
|
|
Err(EntryReadError::NotFound) => Ok(None),
|
|
Err(other) => Err(other),
|
|
}
|
|
}
|
|
|
|
pub fn list_directory<P>(path: P) -> Result<Vec<Entry>, EntryReadError>
|
|
where
|
|
P: AsRef<Path>,
|
|
{
|
|
let mut entries = Vec::new();
|
|
for dir_entry in std::fs::read_dir(path)? {
|
|
let entry = match Entry::from_path(&dir_entry?.path()) {
|
|
Ok(v) => v,
|
|
Err(_) => continue,
|
|
};
|
|
entries.push(entry);
|
|
}
|
|
return Ok(entries);
|
|
}
|
|
|
|
/// Recursively descend into a directory and all sub-directories,
|
|
/// returning an [`Entry`](struct.Entry.html) for each discovered file.
|
|
pub fn traverse_directory<P>(path: P) -> Result<Vec<Entry>, EntryReadError>
|
|
where
|
|
P: AsRef<Path>,
|
|
{
|
|
let mut file_entries = Vec::new();
|
|
for entry in list_directory(path)? {
|
|
match entry.entry_type {
|
|
EntryType::File => file_entries.push(entry),
|
|
EntryType::Directory => file_entries.extend(traverse_directory(&entry.path)?),
|
|
}
|
|
}
|
|
return Ok(file_entries);
|
|
}
|