summaryrefslogtreecommitdiff
path: root/src/fsiter.rs
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2020-11-08 12:16:36 +0200
committerLars Wirzenius <liw@liw.fi>2020-11-08 18:47:38 +0200
commitbb013c2364569f224dd55f549c554a358aee666f (patch)
tree79aac5252a2d9c4aac1f5f045f2e0209e938e27e /src/fsiter.rs
parent3804bc5a3b9456550e1042672f0f79bbfa54f82c (diff)
downloadobnam2-bb013c2364569f224dd55f549c554a358aee666f.tar.gz
feat: add FsIterator to iterate over a directory tree
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)
+}