use exiftool::{ExifTool, ExifToolError};
use std::path::{Path, PathBuf};
const IMAGE_DIR: &str = "data/valid/exiftool_images";
fn find_images_in_dir(dir: &Path) -> std::io::Result<Vec<PathBuf>> {
Ok(std::fs::read_dir(dir)?
.filter_map(Result::ok)
.map(|entry| entry.path())
.filter(|path| {
path.is_file()
&& path
.extension()
.is_some_and(|ext| matches!(ext.to_str(), Some("jpg" | "jpeg" | "png" | "tif")))
})
.collect())
}
fn main() -> Result<(), ExifToolError> {
let et = ExifTool::new()?;
let img_dir_path = Path::new(IMAGE_DIR);
let paths = find_images_in_dir(img_dir_path).unwrap_or_else(|e| {
eprintln!("Failed to read image dir '{IMAGE_DIR}': {e}");
Vec::new()
});
if paths.is_empty() {
println!("No images found in '{IMAGE_DIR}'. Exiting.");
return Ok(());
}
println!(
"Found {} images in '{}'. Reading batch...",
paths.len(),
IMAGE_DIR
);
let results = et.json_batch(&paths, &["-FileName", "-ImageSize"])?;
println!("\n--- Batch Results ---");
for metadata in results {
println!(
"File: {:?}, Size: {:?}",
metadata.get("FileName").and_then(|v| v.as_str()),
metadata.get("ImageSize").and_then(|v| v.as_str()) );
}
Ok(())
}