Skip to main content

style_domain_probe/
style_domain_probe.rs

1//! Validate finite public style domains from reference-generated packages.
2use crabxl::{ColorKind, Fill, WorkbookReader, WorkbookWriter, WriteOptions};
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4    let path = std::env::args().nth(1).ok_or("Missing fixture path")?;
5    let mut book = WorkbookReader::new(std::fs::File::open(path)?)?;
6    let catalog = book.style_catalog()?.ok_or("Missing styles")?;
7    for size in [-1.0, 410.0, 1_000_000.0] {
8        if !catalog.fonts.iter().any(|font| font.size == Some(size)) {
9            return Err("Missing finite font size".into());
10        }
11    }
12    if !catalog.fills.iter().any(|fill| matches!(fill, Fill::Gradient(g) if g.edges[0] == Some(-1.0) && g.edges[1] == Some(2.0))) {
13        return Err("Missing gradient edges".into());
14    }
15    if !catalog
16        .number_formats
17        .iter()
18        .any(|format| format.code().is_empty())
19    {
20        return Err("Missing empty number format".into());
21    }
22    if !catalog.fonts.iter().any(|font| {
23        font.color
24            .as_ref()
25            .is_some_and(|color| color.kind == ColorKind::Indexed(3.into()))
26    }) {
27        return Err("Missing selected indexed color".into());
28    }
29    if let Some(output) = std::env::args().nth(2) {
30        let sheet = book.read_sheet("Sheet")?;
31        let catalog = book.into_style_catalog()?.ok_or("Missing styles")?;
32        let mut writer = WorkbookWriter::from_style_catalog(WriteOptions::default(), catalog)?;
33        writer.start_sheet("Sheet")?;
34        for row in &sheet.rows {
35            writer.write_row(row)?;
36        }
37        writer.finish(std::fs::File::create(output)?)?;
38    }
39    println!("finite-style-domains-ok");
40    Ok(())
41}