#![allow(dead_code)]
use std::process;
use assert_cmd::Command;
use std::io::ErrorKind;
pub fn run_original_prodigal(
input_file: &str,
output_file: &str,
format: &str,
mode: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let mut cmd = process::Command::new("prodigal");
cmd.arg("-i")
.arg(input_file)
.arg("-o")
.arg(output_file)
.arg("-f")
.arg(format)
.arg("-p")
.arg(mode);
let output = cmd.output()?;
if !output.status.success() {
return Err(format!(
"Original prodigal failed: {}",
String::from_utf8_lossy(&output.stderr)
)
.into());
}
Ok(())
}
pub fn run_orphos(
input_file: &str,
output_file: &str,
format: &str,
mode: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let mut cmd = Command::cargo_bin("orphos")?;
cmd.arg("-i")
.arg(input_file)
.arg("-o")
.arg(output_file)
.arg("-f")
.arg(format)
.arg("-p")
.arg(mode);
cmd.assert().success();
Ok(())
}
pub fn normalize_output(s: &str) -> String {
s.replace("Orphos.v1.0.0", "Prodigal.v2.6.3")
.replace("Orphos_v1.0.0", "Prodigal_v2.6.3")
}
pub fn similarity(a: &str, b: &str) -> f32 {
let a_n = normalize_output(a);
let b_n = normalize_output(b);
similar::TextDiff::from_lines(&a_n, &b_n).ratio() as f32
}
pub fn prodigal_available() -> bool {
const CANDIDATE_ARGS: &[&[&str]] = &[&["-v"], &["-h"], &["--help"], &[]];
for args in CANDIDATE_ARGS {
match std::process::Command::new("prodigal").args(*args).output() {
Ok(output) => {
if output.status.success()
|| String::from_utf8_lossy(&output.stdout).contains("Prodigal")
|| String::from_utf8_lossy(&output.stderr).contains("Prodigal")
{
return true;
}
}
Err(e) => {
if e.kind() == ErrorKind::NotFound {
return false; }
}
}
}
false
}