summaryrefslogtreecommitdiff
path: root/src/fsiter.rs
blob: a40ad3486f56edf8a815fe7fbf05c6a16a5615e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::fsentry::FilesystemEntry;
use log::info;
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)) => {
                info!("found {}", entry.path().display());
                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 entry = FilesystemEntry::from_metadata(e.path(), &meta)?;
    Ok(entry)
}