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
use walkdir::{DirEntry, FilterEntry, IntoIter, WalkDir};
pub enum FileIter {
AllFilesIter(IntoIter),
VisibleFilesIter(FilterEntry<IntoIter, for<'r> fn(&'r DirEntry) -> bool>),
}
impl FileIter {
pub fn new(path: &str, with_hidden_files: bool) -> FileIter {
if with_hidden_files {
FileIter::AllFilesIter(WalkDir::new(path).into_iter())
} else {
FileIter::VisibleFilesIter(WalkDir::new(path).into_iter().filter_entry(|entry| {
!entry
.file_name()
.to_str()
.map(|s| s.starts_with('.') && s != "." && s != "..")
.unwrap_or(false)
}))
}
}
}
impl Iterator for FileIter {
type Item = walkdir::Result<DirEntry>;
fn next(&mut self) -> Option<walkdir::Result<DirEntry>> {
match self {
FileIter::AllFilesIter(it) => it.next(),
FileIter::VisibleFilesIter(it) => it.next(),
}
}
}