aether_renderer_core/
input.rs1use glob::glob;
2use std::path::{Path, PathBuf};
3
4pub 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}