diff options
author | Lars Wirzenius <liw@liw.fi> | 2020-11-08 12:16:36 +0200 |
---|---|---|
committer | Lars Wirzenius <liw@liw.fi> | 2020-11-08 18:47:38 +0200 |
commit | bb013c2364569f224dd55f549c554a358aee666f (patch) | |
tree | 79aac5252a2d9c4aac1f5f045f2e0209e938e27e /src/fsiter.rs | |
parent | 3804bc5a3b9456550e1042672f0f79bbfa54f82c (diff) | |
download | obnam2-bb013c2364569f224dd55f549c554a358aee666f.tar.gz |
feat: add FsIterator to iterate over a directory tree
Diffstat (limited to 'src/fsiter.rs')
-rw-r--r-- | src/fsiter.rs | 37 |
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) +} |