| use std::ffi::OsString; | |
| use std::fs; | |
| use std::io; | |
| use std::path::PathBuf; | |
| use crate::errors::{Error, ErrorKind}; | |
| /// Returns an iterator over the entries within a directory. | |
| /// | |
| /// Wrapper for [`fs::read_dir`](https://doc.rust-lang.org/stable/std/fs/fn.read_dir.html). | |
| pub fn read_dir<P: Into<PathBuf>>(path: P) -> io::Result<ReadDir> { | |
| let path = path.into(); | |
| match fs::read_dir(&path) { | |
| Ok(inner) => Ok(ReadDir { inner, path }), | |
| Err(source) => Err(Error::build(source, ErrorKind::ReadDir, path)), | |
| } | |
| } | |
| /// Wrapper around [`std::fs::ReadDir`][std::fs::ReadDir] which adds more | |
| /// helpful information to all errors. | |
| /// | |
| /// This struct is created via [`fs_err::read_dir`][fs_err::read_dir]. | |
| /// | |
| /// [std::fs::ReadDir]: https://doc.rust-lang.org/stable/std/fs/struct.ReadDir.html | |
| /// [fs_err::read_dir]: fn.read_dir.html | |
| #[derive(Debug)] | |
| pub struct ReadDir { | |
| inner: fs::ReadDir, | |
| path: PathBuf, | |
| } | |
| impl Iterator for ReadDir { | |
| type Item = io::Result<DirEntry>; | |
| fn next(&mut self) -> Option<Self::Item> { | |
| Some( | |
| self.inner | |
| .next()? | |
| .map_err(|source| Error::build(source, ErrorKind::ReadDir, &self.path)) | |
| .map(|inner| DirEntry { inner }), | |
| ) | |
| } | |
| } | |
| /// Wrapper around [`std::fs::DirEntry`][std::fs::DirEntry] which adds more | |
| /// helpful information to all errors. | |
| /// | |
| /// [std::fs::DirEntry]: https://doc.rust-lang.org/stable/std/fs/struct.DirEntry.html | |
| #[derive(Debug)] | |
| pub struct DirEntry { | |
| inner: fs::DirEntry, | |
| } | |
| impl DirEntry { | |
| /// Returns the full path to the file that this entry represents. | |
| /// | |
| /// Wrapper for [`DirEntry::path`](https://doc.rust-lang.org/stable/std/fs/struct.DirEntry.html#method.path). | |
| pub fn path(&self) -> PathBuf { | |
| self.inner.path() | |
| } | |
| /// Returns the metadata for the file that this entry points at. | |
| /// | |
| /// Wrapper for [`DirEntry::metadata`](https://doc.rust-lang.org/stable/std/fs/struct.DirEntry.html#method.metadata). | |
| pub fn metadata(&self) -> io::Result<fs::Metadata> { | |
| self.inner | |
| .metadata() | |
| .map_err(|source| Error::build(source, ErrorKind::Metadata, self.path())) | |
| } | |
| /// Returns the file type for the file that this entry points at. | |
| /// | |
| /// Wrapper for [`DirEntry::file_type`](https://doc.rust-lang.org/stable/std/fs/struct.DirEntry.html#method.file_type). | |
| pub fn file_type(&self) -> io::Result<fs::FileType> { | |
| self.inner | |
| .file_type() | |
| .map_err(|source| Error::build(source, ErrorKind::Metadata, self.path())) | |
| } | |
| /// Returns the file name of this directory entry without any leading path component(s). | |
| /// | |
| /// Wrapper for [`DirEntry::file_name`](https://doc.rust-lang.org/stable/std/fs/struct.DirEntry.html#method.file_name). | |
| pub fn file_name(&self) -> OsString { | |
| self.inner.file_name() | |
| } | |
| } | |
| #[cfg(unix)] | |
| mod unix { | |
| use std::os::unix::fs::DirEntryExt; | |
| use super::*; | |
| impl DirEntryExt for DirEntry { | |
| fn ino(&self) -> u64 { | |
| self.inner.ino() | |
| } | |
| } | |
| } |