use crate::cli::Cli;
use crate::io;
use crate::io::statistics::StatisticsOutput;
use crate::utils;
use std::error::Error;
use std::path::Path;
fn ensure_bam_index_exists(bam_path: &Path) -> Result<(), Box<dyn Error>> {
let bai_path = bam_path.with_extension("bam.bai");
if bai_path.exists() {
return Ok(());
}
Err(format!(
"BAM index not found at {bai_path:?}. Please run 'samtools index {bam_path:?}' to create it."
)
.into())
}
pub async fn process_single_sample(cli: &Cli) -> Result<StatisticsOutput, Box<dyn Error>> {
let bam_path = cli.input_path();
ensure_bam_index_exists(bam_path)?;
std::fs::create_dir_all(cli.output_dir())?;
let read_stats = utils::extract_read_stats(bam_path)?;
let summary = io::run_coverage_async(cli, Some(read_stats.clone())).await?;
let output_dir = cli.output_dir();
let prefix = cli.output_prefix();
let statistics_path = output_dir.join(format!("{prefix}.statistics"));
println!("Generating statistics output at {statistics_path:?}");
let statistics_output = io::statistics::generate_statistics_output(
bam_path,
&statistics_path,
Some(&read_stats),
summary.mean_coverage(),
)?;
Ok(statistics_output)
}