summaryrefslogtreecommitdiff
path: root/src/fsiter.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/fsiter.rs')
-rw-r--r--src/fsiter.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/fsiter.rs b/src/fsiter.rs
new file mode 100644
index 0000000..929c81e
--- /dev/null
+++ b/src/fsiter.rs
@@ -0,0 +1,37 @@
+use crate::fsentry::FilesystemEntry;
+use std::path::Path;
+use walkdir::{IntoIter, WalkDir};
+
+/// Iterator over file system entries in a directory tree.
+pub struct FsIterator {
+ iter: IntoIter,
+}
+
+impl FsIterator {
+ pub fn new(root: &Path) -> Self {
+ Self {
+ iter: WalkDir::new(root).into_iter(),
+ }
+ }
+}
+
+impl Iterator for FsIterator {
+ type Item = Result<FilesystemEntry, anyhow::Error>;
+ fn next(&mut self) -> Option<Self::Item> {
+ match self.iter.next() {
+ None => None,
+ Some(Ok(entry)) => Some(new_entry(&entry)),
+ Some(Err(err)) => Some(Err(err.into())),
+ }
+ }
+}
+
+fn new_entry(e: &walkdir::DirEntry) -> anyhow::Result<FilesystemEntry> {
+ let meta = e.metadata()?;
+ let kind = if meta.is_dir() {
+ FilesystemEntry::directory(e.path())
+ } else {
+ FilesystemEntry::regular(e.path(), meta.len())
+ };
+ Ok(kind)
+}