use crate::agent::CliError;
use std::path::PathBuf;
#[derive(clap::Args)]
pub(crate) struct SafetyArgs {
pub input: PathBuf,
#[arg(long)]
pub fps: Option<f64>,
#[arg(long)]
pub display: Option<String>,
#[arg(long, default_value = "itu-bt1702")]
pub standard: String,
#[arg(long)]
pub json: bool,
#[arg(long, default_value = "safety-report")]
pub out: PathBuf,
#[arg(long)]
pub junit: Option<PathBuf>,
}
#[derive(clap::Args)]
pub(crate) struct A11yArgs {
pub input: PathBuf,
#[arg(long)]
pub config: Option<PathBuf>,
#[arg(long)]
pub json: bool,
#[arg(long, default_value = "a11y-report")]
pub out: PathBuf,
#[arg(long)]
pub junit: Option<PathBuf>,
#[arg(long)]
pub suggest_regions: bool,
#[arg(long, requires = "suggest_regions")]
pub keys_dir: Option<PathBuf>,
}
pub(crate) fn safety(args: SafetyArgs) -> Result<u8, CliError> {
let options = saccade_core::safety::Options {
fps: args.fps,
display: args
.display
.as_deref()
.map(saccade_core::safety::Display::parse)
.transpose()?
.unwrap_or_default(),
standard: saccade_core::safety::Standard::parse(&args.standard)?,
};
let report = saccade_core::safety::run(&args.input, &args.out, &options)?;
if let Some(path) = &args.junit {
saccade_core::safety::output::junit(
path,
"saccade safety pre-check",
&report.junit_cases(),
&[&args.input],
)?;
}
if args.json {
crate::local_cmd::print(
&crate::local_cmd::analysis_result(&serde_json::to_value(&report)?, &args.out)?,
true,
)?;
} else {
crate::emit(&report.text())?;
}
Ok(u8::from(report.verdict == "FAIL"))
}
pub(crate) fn a11y(args: A11yArgs) -> Result<u8, CliError> {
let options = saccade_core::a11y::Options {
config: args.config.clone(),
suggest_regions: args.suggest_regions,
keys_dir: args.keys_dir,
};
let report = saccade_core::a11y::run(&args.input, &args.out, &options)?;
if let Some(path) = &args.junit {
let mut inputs = vec![args.input.as_path()];
if let Some(config) = &args.config {
inputs.push(config.as_path());
}
saccade_core::safety::output::junit(
path,
"saccade accessibility pre-check",
&report.junit_cases(),
&inputs,
)?;
}
if args.json {
crate::local_cmd::print(
&crate::local_cmd::analysis_result(&serde_json::to_value(&report)?, &args.out)?,
true,
)?;
} else {
crate::emit(&report.text())?;
}
Ok(u8::from(report.verdict == "FAIL"))
}