diff options
Diffstat (limited to 'src/fswalk.rs')
-rw-r--r-- | src/fswalk.rs | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/fswalk.rs b/src/fswalk.rs index ac95540..d9ecb87 100644 --- a/src/fswalk.rs +++ b/src/fswalk.rs @@ -1,3 +1,4 @@ +use std::fs; use std::io; use std::path::PathBuf; use std::cmp::Ordering; @@ -6,18 +7,24 @@ use std::cmp::Ordering; #[derive(Debug)] pub struct Entry { path: PathBuf, + meta: fs::Metadata, } impl Entry { - fn new(path: &PathBuf) -> Entry { + fn new(path: &PathBuf, meta: &fs::Metadata) -> Entry { Entry { path: path.clone(), + meta: meta.clone(), } } pub fn path(&self) -> String { self.path.to_string_lossy().to_string() } + + pub fn metadata(&self) -> fs::Metadata { + self.meta.clone() + } } impl Eq for Entry {} @@ -52,7 +59,8 @@ pub struct DirTree { impl DirTree { pub fn new(path: &str) -> DirTree { let mut dt = DirTree::empty(); - dt.add_dir(&PathBuf::from(path)); + let meta = fs::symlink_metadata(path).expect("can't stat dir"); + dt.add_dir(&PathBuf::from(path), &meta); dt } @@ -63,8 +71,8 @@ impl DirTree { } } - fn add_dir(&mut self, path: &PathBuf) { - let entry = Entry::new(path); + fn add_dir(&mut self, path: &PathBuf, meta: &fs::Metadata) { + let entry = Entry::new(path, meta); self.dirs.push(entry); } @@ -74,7 +82,7 @@ impl DirTree { for dir_entry in path.read_dir()? { let dir_entry = dir_entry?; let metadata = dir_entry.metadata()?; - let entry = Entry::new(&dir_entry.path()); + let entry = Entry::new(&dir_entry.path(), &metadata); if metadata.is_dir() { dirs.push(entry); } else { |