fencryption_lib/
walk_dir.rs

1//! Walk through a directory.
2
3use std::{
4    fs::{self, DirEntry, ReadDir},
5    io::Result,
6    path::Path,
7};
8
9/// Walk through the specified directory.
10pub fn walk_dir<P>(path: P) -> Result<WalkDirIterator>
11where
12    P: AsRef<Path>,
13{
14    Ok(WalkDirIterator {
15        levels: Vec::from([fs::read_dir(path.as_ref())?]),
16    })
17}
18
19/// The Iterator for WalkDir
20pub struct WalkDirIterator {
21    levels: Vec<ReadDir>,
22}
23
24impl Iterator for WalkDirIterator {
25    type Item = Result<DirEntry>;
26
27    fn next(&mut self) -> Option<Self::Item> {
28        match self.levels.last_mut() {
29            Some(current_dir) => match current_dir.next() {
30                Some(Ok(entry)) => match entry.file_type() {
31                    Ok(file_type) => {
32                        if file_type.is_dir() {
33                            self.levels.push(match fs::read_dir(&entry.path()) {
34                                Ok(v) => v,
35                                Err(e) => return Some(Err(e)),
36                            });
37                        }
38                        return Some(Ok(entry));
39                    }
40                    Err(e) => return Some(Err(e)),
41                },
42                Some(Err(e)) => return Some(Err(e)),
43                None => {
44                    self.levels.pop();
45                    return self.next();
46                }
47            },
48            None => None,
49        }
50    }
51}