mod backend {
use crate::util::oarfish_types::AlnRecordLike;
use noodles_sam::header::Header;
use std::sync::Arc;
pub(crate) type Mapper = Arc<rammap::api::Aligner>;
#[derive(Debug, Clone)]
pub(crate) struct RammapMapping {
pub(crate) m: rammap::api::Mapping,
pub(crate) query_len: usize,
}
pub(crate) type OMapping = RammapMapping;
#[inline]
pub(crate) fn map_read(
aligner: &Mapper,
name: &[u8],
seq: &[u8],
) -> anyhow::Result<Vec<OMapping>> {
let qname = std::str::from_utf8(name).unwrap_or("read");
let res = aligner.map_seq(qname, seq);
Ok(res
.mappings
.into_iter()
.map(|m| RammapMapping {
m,
query_len: seq.len(),
})
.collect())
}
impl AlnRecordLike for RammapMapping {
fn opt_sequence_len(&self) -> Option<usize> {
Some(self.query_len)
}
fn is_reverse_complemented(&self) -> bool {
self.m.strand == rammap::api::Strand::Reverse
}
fn is_unmapped(&self) -> bool {
false
}
fn ref_id(&self, _header: &Header) -> anyhow::Result<usize> {
Ok(self.m.target_id)
}
fn aln_span(&self) -> Option<usize> {
Some(self.m.target_end - self.m.target_start)
}
fn aln_score(&self) -> Option<i64> {
Some(self.m.score as i64)
}
fn aln_start(&self) -> u32 {
self.m.target_start as u32
}
fn aln_end(&self) -> u32 {
self.m.target_end as u32
}
fn is_supp(&self) -> bool {
self.m.is_supplementary
}
fn name(&self) -> Option<String> {
None
}
}
#[inline]
pub(crate) fn alignment_score(m: &OMapping) -> i32 {
m.m.score
}
}
pub(crate) use backend::{Mapper, OMapping, alignment_score, map_read};