nanocov 0.1.0

Rust Coverage Calculator and QC Plot Generation Tool
Documentation
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())
}

/// Run the full single-sample workflow: extract read stats, coverage, and write statistics.
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)
}