fencryption_lib/
walk_dir.rs1use std::{
4 fs::{self, DirEntry, ReadDir},
5 io::Result,
6 path::Path,
7};
8
9pub 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
19pub 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}