From bb013c2364569f224dd55f549c554a358aee666f Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 8 Nov 2020 12:16:36 +0200 Subject: feat: add FsIterator to iterate over a directory tree --- src/fsiter.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/fsiter.rs (limited to 'src/fsiter.rs') 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; + fn next(&mut self) -> Option { + 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 { + let meta = e.metadata()?; + let kind = if meta.is_dir() { + FilesystemEntry::directory(e.path()) + } else { + FilesystemEntry::regular(e.path(), meta.len()) + }; + Ok(kind) +} -- cgit v1.2.1