use crate::{Config, FileInfo, WallSwitchResult};
use std::path::Path;
use walkdir::WalkDir;
pub fn get_files_from_directory<P>(path: P, config: &Config) -> WallSwitchResult<Vec<FileInfo>>
where
P: AsRef<Path>,
{
let extensions = &config.extensions;
let mut all_files: Vec<FileInfo> = WalkDir::new(path)
.follow_links(false)
.into_iter()
.filter_map(Result::ok)
.filter(|entry| entry.file_type().is_file())
.filter(|entry| {
entry
.path()
.extension()
.and_then(|ext| ext.to_str())
.is_some_and(|ext_str| {
extensions
.iter()
.any(|allowed_ext| ext_str.eq_ignore_ascii_case(allowed_ext))
})
})
.filter_map(|entry| {
let metadata = entry.metadata().ok()?;
let size = metadata.len();
let mtime = metadata
.modified()
.ok()?
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
Some(FileInfo {
size,
mtime,
path: entry.into_path(),
..Default::default()
})
})
.collect();
all_files.sort_unstable_by(|a, b| a.path.cmp(&b.path));
Ok(all_files)
}