Files
pdfcraft/xtask/src/main.rs
T

58 lines
2.4 KiB
Rust

//! Project automation for PrintCraft, run via `cargo xtask <command>`.
use std::process::ExitCode;
mod assets;
mod demo_pdf;
mod gates;
mod layers;
mod screenshots;
type Command = fn(&[String]) -> anyhow::Result<()>;
/// Every subcommand: name, one-line summary, entry point.
const COMMANDS: &[(&str, &str, Command)] = &[
("layers", "Enforce the crate dependency layering (plan/architecture.md §3)", gates::layers),
("wasm", "cargo check --target wasm32-unknown-unknown for every crate below L8", gates::wasm),
("deny", "Dependency licences, bans, sources and advisories (deny.toml; needs cargo-deny)", gates::deny),
("ci", "fmt --check, clippy -D warnings, test, layers, wasm, assets, deny (stops at first failure)", gates::ci),
("assets", "Enforce the asset policy (AGENTS.md §1) against ATTRIBUTION.toml; --write regenerates ATTRIBUTION.md", assets::run),
("corpus", "Fetch test corpora into corpus/ (git-ignored): pdf.js test PDFs", gates::corpus),
("check", "Robustness sweep over corpus/ with printcraft-cli; fails on crashes or regressions vs xtask/baselines", gates::check),
("text-oracle", "Compare text extraction with pdftotext over corpus/ (word F1; target median ≥ 0.97)", gates::text_oracle),
("screenshots", "Regenerate the README screenshots in docs/images/ and their ATTRIBUTION entries", screenshots::run),
("demo-pdf", "Build dist/demo/printcraft-showcase.pdf (needs Google Chrome or Chromium)", demo_pdf::run),
];
fn main() -> ExitCode {
let args: Vec<String> = std::env::args().skip(1).collect();
let Some(name) = args.first() else {
print_help();
return ExitCode::FAILURE;
};
if matches!(name.as_str(), "help" | "-h" | "--help") {
print_help();
return ExitCode::SUCCESS;
}
let Some((_, _, command)) = COMMANDS.iter().find(|(n, _, _)| n == name) else {
eprintln!("xtask: unknown command `{name}`\n");
print_help();
return ExitCode::FAILURE;
};
match command(&args[1..]) {
Ok(()) => ExitCode::SUCCESS,
Err(err) => {
eprintln!("xtask {name}: error: {err:#}");
ExitCode::FAILURE
}
}
}
fn print_help() {
eprintln!("Usage: cargo xtask <command> [args]\n\nCommands:");
for (name, about, _) in COMMANDS {
eprintln!(" {name:<12} {about}");
}
eprintln!(" {:<12} Show this list", "help");
}