aether_renderer_core/
input.rs

1use glob::glob;
2use std::path::{Path, PathBuf};
3
4/// Collect files from `input_folder` matching the optional pattern.
5/// Defaults to `*.png` when no pattern is provided.
6pub fn collect_input_frames(
7    input_folder: &Path,
8    file_pattern: Option<String>,
9) -> Result<Vec<PathBuf>, Box<dyn std::error::Error>> {
10    let pattern = file_pattern.unwrap_or_else(|| "*.png".to_string());
11    let glob_path = format!("{}/{}", input_folder.display(), pattern);
12    let mut frames: Vec<PathBuf> = glob(&glob_path)?.filter_map(Result::ok).collect();
13    frames.sort();
14    Ok(frames)
15}
16
17#[cfg(test)]
18mod tests {
19    use super::collect_input_frames;
20    use std::fs::File;
21    use tempfile::tempdir;
22
23    #[test]
24    fn collects_all_png_by_default() -> Result<(), Box<dyn std::error::Error>> {
25        let dir = tempdir()?;
26        File::create(dir.path().join("a.png"))?;
27        File::create(dir.path().join("b.png"))?;
28        let frames = collect_input_frames(dir.path(), None)?;
29        assert_eq!(frames.len(), 2);
30        Ok(())
31    }
32
33    #[test]
34    fn collects_with_custom_pattern() -> Result<(), Box<dyn std::error::Error>> {
35        let dir = tempdir()?;
36        File::create(dir.path().join("scene1_001.png"))?;
37        File::create(dir.path().join("scene2_001.png"))?;
38        let frames = collect_input_frames(dir.path(), Some("scene1_*.png".into()))?;
39        assert_eq!(frames.len(), 1);
40        assert!(frames[0].ends_with("scene1_001.png"));
41        Ok(())
42    }
43}