#[provable_contracts_macros::contract("pmat-core.yaml", equation = "path_exists")]
pub fn execute(config: CargoMutantsConfig) -> Result<PathBuf> {
eprintln!("๐งช cargo-mutants Backend");
eprintln!();
let wrapper = CargoMutantsWrapper::new().map_err(|e| {
anyhow::anyhow!(
"cargo-mutants not found. Install: cargo install cargo-mutants. Error: {}",
e
)
})?;
wrapper.validate_version()
.map_err(|e| anyhow::anyhow!("cargo-mutants version too old. Minimum v24.7.0 required. Upgrade: cargo install --force cargo-mutants. Error: {}", e))?;
let version = wrapper
.version()
.map_err(|e| anyhow::anyhow!("Failed to get cargo-mutants version: {}", e))?;
eprintln!("โ
Detected: {}", version);
eprintln!();
let output_dir = if let Some(ref output) = config.output {
output.clone()
} else {
config.path.join("mutants.out")
};
let mut cmd = Command::new("cargo");
cmd.arg("mutants");
cmd.arg("--output").arg(&output_dir);
cmd.current_dir(&config.path);
cmd.arg("--timeout").arg(config.timeout.to_string());
if let Some(j) = config.jobs {
cmd.arg("--jobs").arg(j.to_string());
}
if config.all_features {
cmd.arg("--all-features");
} else if config.no_default_features {
cmd.arg("--no-default-features");
if let Some(ref feats) = config.features {
cmd.arg("--features").arg(feats.join(","));
}
} else if let Some(ref feats) = config.features {
cmd.arg("--features").arg(feats.join(","));
}
if config.no_shuffle {
cmd.arg("--no-shuffle");
}
eprintln!(
"๐ง Executing: cargo mutants --output {} --timeout {} {}",
output_dir.display(),
config.timeout,
if let Some(j) = config.jobs {
format!("--jobs {}", j)
} else {
String::new()
}
);
eprintln!();
eprintln!("โณ Running mutation tests... (this may take several minutes)");
eprintln!();
let output_result = cmd
.output()
.context("Failed to execute cargo mutants command")?;
let exit_code = output_result.status.code().unwrap_or(-1);
if exit_code != 0 && exit_code != 2 {
let stderr = String::from_utf8_lossy(&output_result.stderr);
anyhow::bail!(
"cargo-mutants execution failed with exit code {}:\n{}",
exit_code,
stderr
);
}
eprintln!("โ
Mutation testing complete");
eprintln!();
let actual_output = if output_dir.join("outcomes.json").exists() {
output_dir
} else if output_dir
.join("mutants.out")
.join("outcomes.json")
.exists()
{
output_dir.join("mutants.out")
} else {
output_dir
};
Ok(actual_output)
}