use std::ffi::{OsStr, OsString};
use std::fs::{FileType, Metadata};
use std::path::{Path, PathBuf};
#[derive(Debug, Clone)]
pub struct DirEntry {
path: PathBuf,
file_type: FileType,
metadata: Option<Metadata>,
}
impl DirEntry {
pub(crate) fn new(path: PathBuf, file_type: FileType, metadata: Option<Metadata>) -> Self {
Self {
path,
file_type,
metadata,
}
}
pub fn path(&self) -> &Path {
&self.path
}
pub fn into_path(self) -> PathBuf {
self.path
}
pub fn file_name(&self) -> OsString {
self.path
.file_name()
.map(|s| s.to_os_string())
.unwrap_or_default()
}
pub fn file_type(&self) -> FileType {
self.file_type
}
pub fn is_dir(&self) -> bool {
self.file_type.is_dir()
}
pub fn is_file(&self) -> bool {
self.file_type.is_file()
}
pub fn is_symlink(&self) -> bool {
self.file_type.is_symlink()
}
pub fn metadata(&self) -> Option<&Metadata> {
self.metadata.as_ref()
}
pub fn display_name(&self) -> &OsStr {
self.path.file_name().unwrap_or(OsStr::new(""))
}
pub fn relative_to(&self, root: &Path) -> Option<PathBuf> {
self.path.strip_prefix(root).ok().map(Path::to_path_buf)
}
}