use crate::*; /// Convert a file path into an [Entry]. pub fn get_entry(path: impl AsRef) -> ReadResult { Entry::from_path(path) } /// Convert a file path that might not be valid into an [Entry]. This will return /// as [Option::None] instead of [EntryReadError::NotFound] if the file doesn't exist. pub fn get_optional_entry(path: impl AsRef) -> ReadResult> { match get_entry(path) { Ok(e) => Ok(Some(e)), Err(EntryReadError { error_kind: EntryErrorKind::NotFound, .. }) => Ok(None), Err(other) => Err(other), } } /// Get an [Entry] for every file and subdirectory within a directory. pub fn list_directory(path: impl AsRef) -> ReadResult>{ let path = path.as_ref(); macro_rules! raise { ($err:expr) => {io_result_to_read_result($err, path)?}; } let mut entries = Vec::new(); for dir_entry in raise!(std::fs::read_dir(path)) { let entry = match Entry::from_path(&raise!(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] for each discovered file. pub fn traverse_directory(path: impl AsRef) -> ReadResult> { 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); }