pub(crate) mod cargo;
pub(crate) mod go;
mod pytest;
pub(crate) mod vitest;
use std::process::ExitCode;
const KNOWN_RUNNERS: &[&str] = &["cargo", "go", "vitest", "jest", "pytest"];
pub(crate) fn run(args: &[String]) -> anyhow::Result<ExitCode> {
if args.is_empty() || args.iter().any(|a| matches!(a.as_str(), "--help" | "-h")) {
print_help();
return Ok(ExitCode::SUCCESS);
}
let (filtered_args, show_stats) = crate::cmd::extract_show_stats(args);
let Some((runner_name, runner_args)) = filtered_args.split_first() else {
print_help();
return Ok(ExitCode::SUCCESS);
};
let runner = runner_name.as_str();
match runner {
"cargo" => cargo::run(runner_args, show_stats),
"go" => go::run(runner_args, show_stats),
"vitest" | "jest" => vitest::run(runner, runner_args, show_stats),
"pytest" => pytest::run(runner_args, show_stats),
_ => {
let safe_runner = crate::cmd::sanitize_for_display(runner);
eprintln!(
"skim test: unknown runner '{safe_runner}'\n\
Available runners: {}\n\
Run 'skim test --help' for usage information",
KNOWN_RUNNERS.join(", ")
);
Ok(ExitCode::FAILURE)
}
}
}
fn print_help() {
println!("skim test <runner> [args...]");
println!();
println!(" Run tests through a runner and parse the output.");
println!();
println!("Available runners:");
for runner in KNOWN_RUNNERS {
println!(" {runner}");
}
println!();
println!("Examples:");
println!(" skim test cargo Run cargo test");
println!(" skim test go ./... Run all Go tests");
println!(" skim test vitest Run vitest");
println!(" skim test pytest Run pytest");
println!(" cargo test 2>&1 | skim test cargo Pipe cargo output");
}