d4-hts 0.3.7

The htslib binding used by D4
Documentation
use super::{cigar_ext::Cigar, cigar_ext::CigarIter, seq_ext::SequenceIter, Alignment, Nucleotide};

pub struct MapIter<'a> {
    ref_pos: usize,
    cur_cigar: Option<Cigar>,
    seq_it: SequenceIter<'a>,
    cigar_it: CigarIter<'a>,
}

impl<'a> Alignment<'a> {
    pub fn map_iter(&self) -> MapIter<'_> {
        let mut ret = MapIter {
            ref_pos: self.ref_begin(),
            seq_it: self.sequence().into_iter(),
            cigar_it: self.cigar(),
            cur_cigar: None,
        };
        ret.cur_cigar = ret.cigar_it.next();
        ret
    }
}

#[derive(Debug)]
pub struct Mapping {
    ref_base: Option<usize>,
    seq_base: Option<Nucleotide>,
}

impl<'a> Iterator for MapIter<'a> {
    type Item = Mapping;
    fn next(&mut self) -> Option<Mapping> {
        let mut ret = None;
        if let Some(ref mut cur_cigar) = self.cur_cigar {
            let mut map = Mapping {
                ref_base: None,
                seq_base: None,
            };

            if cur_cigar.in_reference() {
                map.ref_base = Some(self.ref_pos);
                self.ref_pos += 1;
            }

            if cur_cigar.in_alignment() {
                map.seq_base = self.seq_it.next();
            }

            cur_cigar.len -= 1;
            ret = Some(map);
        }

        if ret.is_some() && self.cur_cigar.as_ref().unwrap().len == 0 {
            self.cur_cigar = self.cigar_it.next();
        }

        ret
    }
}