use std::fs::{FileType, Metadata};
use std::path::{Path, PathBuf};
use crate::error::Error;
pub struct DirEntry {
path: PathBuf,
file_type: FileType,
follow_symlinks: bool,
}
impl DirEntry {
pub fn path(&self) -> &Path {
&self.path
}
pub fn file_type(&self) -> FileType {
self.file_type
}
pub fn metadata(&self) -> Result<Metadata, Error> {
if self.follow_symlinks {
self.path.metadata()
} else {
self.path.symlink_metadata()
}
.map_err(|err| Error::new(err, self.path.clone()))
}
pub fn with_follow_symlinks(mut self, x: bool) -> Self {
self.follow_symlinks = x;
self
}
}
impl TryFrom<std::fs::DirEntry> for DirEntry {
type Error = Error;
fn try_from(entry: std::fs::DirEntry) -> Result<Self, Self::Error> {
let path = entry.path();
match entry.file_type() {
Ok(file_type) => Ok(DirEntry {
path,
file_type,
follow_symlinks: false,
}),
Err(err) => Err(Error::new(err, path)),
}
}
}
impl TryFrom<PathBuf> for DirEntry {
type Error = Error;
fn try_from(path: PathBuf) -> Result<Self, Self::Error> {
match path.symlink_metadata().map(|m| m.file_type()) {
Ok(file_type) => Ok(DirEntry {
path,
file_type,
follow_symlinks: false,
}),
Err(err) => Err(Error::new(err, path)),
}
}
}