wallswitch/
walkdir.rs

1use crate::{Config, FileInfo, MyResult};
2//use rayon::prelude::*;
3use std::path::Path;
4use walkdir::{DirEntry, WalkDir};
5
6/// Get all files into one vector.
7///
8/// Use walkdir.
9pub fn get_files_from_directory<P>(path: P, config: &Config) -> MyResult<Vec<FileInfo>>
10where
11    P: AsRef<Path>,
12{
13    let entries: Vec<DirEntry> = get_image_entries(path, config)?;
14
15    let all_files: Vec<FileInfo> = entries
16        //.into_par_iter() // rayon parallel iterator
17        .into_iter()
18        .filter_map(|entry| {
19            let metadata = entry.metadata().ok()?;
20            let size = metadata.len();
21            //let extension = metadata.file_type();
22
23            Some(FileInfo {
24                size,
25                path: entry.into_path(),
26                ..Default::default()
27            })
28        })
29        .collect();
30
31    Ok(all_files)
32}
33
34/// Get result: Vec<DirEntry>.
35fn get_image_entries<P>(path: P, config: &Config) -> MyResult<Vec<DirEntry>>
36where
37    P: AsRef<Path>,
38{
39    // default extensions: ["avif", "jpg", "jpeg", "png", "svg", "tif", "webp"]
40    let extensions = &config.extensions;
41
42    let entries: Vec<DirEntry> = WalkDir::new(path)
43        .sort_by_file_name()
44        .into_iter()
45        .flatten() // Result<DirEntry, Error> to DirEntry
46        .filter(|entry| entry.file_type().is_file())
47        .filter(|entry| {
48            entry.path().extension().is_some_and(|ext| {
49                extensions
50                    .iter()
51                    .any(|extension| ext.eq_ignore_ascii_case(extension))
52            })
53        })
54        .collect();
55
56    Ok(entries)
57}