rsomics-minimap2 0.1.0

Long/short-read aligner — CLI wrapper of minimap2 FFI bindings (Quadrant ②)
Documentation
use std::fmt::Write;
use std::path::Path;

use rsomics_common::{Result, RsomicsError};

pub fn align(reference: &Path, query: &Path, preset: &str) -> Result<String> {
    let mm_preset = match preset {
        "sr" => minimap2::Preset::Sr,
        "map-hifi" => minimap2::Preset::MapHifi,
        "map-pb" => minimap2::Preset::MapPb,
        _ => minimap2::Preset::MapOnt,
    };

    let aligner = minimap2::Aligner::builder()
        .preset(mm_preset)
        .with_index(reference.to_str().unwrap_or(""), None)
        .map_err(|e| RsomicsError::InvalidInput(format!("building index: {e}")))?;

    let seqs = std::fs::read_to_string(query)
        .map_err(|e| RsomicsError::InvalidInput(format!("{}: {e}", query.display())))?;

    let mut output = String::new();
    for record in seqs.split('>').skip(1) {
        let mut lines = record.lines();
        let name = lines.next().unwrap_or("unknown");
        let seq: String = lines.collect();

        let mappings = aligner
            .map(
                seq.as_bytes(),
                false,
                false,
                None,
                None,
                Some(name.as_bytes()),
            )
            .map_err(|e| RsomicsError::InvalidInput(format!("mapping: {e}")))?;

        for m in mappings {
            writeln!(output, "{m:?}").ok();
        }
    }

    Ok(output)
}