Skip to main content

agent_image_diff/output/
summary.rs

1use crate::region::DiffResult;
2use anyhow::Result;
3use std::io::Write;
4
5pub fn write_summary(result: &DiffResult, writer: &mut impl Write) -> Result<()> {
6    if result.is_match {
7        writeln!(writer, "Images are identical.")?;
8        return Ok(());
9    }
10
11    writeln!(writer, "Images differ.")?;
12    writeln!(
13        writer,
14        "  Dimensions: {}x{}",
15        result.dimensions.width, result.dimensions.height
16    )?;
17    writeln!(
18        writer,
19        "  Changed pixels: {} ({:.2}%)",
20        result.stats.changed_pixels, result.stats.diff_percentage
21    )?;
22    if result.stats.antialiased_pixels > 0 {
23        writeln!(
24            writer,
25            "  Anti-aliased pixels (excluded): {}",
26            result.stats.antialiased_pixels
27        )?;
28    }
29    writeln!(writer, "  Regions: {}", result.stats.region_count)?;
30
31    if let Some(mismatch) = &result.dimension_mismatch {
32        writeln!(
33            writer,
34            "  Dimension mismatch: baseline={}x{}, candidate={}x{}",
35            mismatch.baseline.width,
36            mismatch.baseline.height,
37            mismatch.candidate.width,
38            mismatch.candidate.height
39        )?;
40    }
41
42    writeln!(writer)?;
43    for region in &result.regions {
44        writeln!(
45            writer,
46            "  Region #{} [{}]: {}x{} at ({},{}) — {} pixels, avg delta {:.3}, max delta {:.3}",
47            region.id,
48            region.label,
49            region.bounding_box.width,
50            region.bounding_box.height,
51            region.bounding_box.x,
52            region.bounding_box.y,
53            region.pixel_count,
54            region.avg_delta,
55            region.max_delta
56        )?;
57    }
58
59    Ok(())
60}