use auto_impl::auto_impl;
use bitnuc::BitSize;
use crate::Result;
#[auto_impl(&, &mut)]
pub trait BinseqRecord {
fn bitsize(&self) -> BitSize;
fn index(&self) -> u64;
fn flag(&self) -> Option<u64>;
fn sheader(&self) -> &[u8];
fn xheader(&self) -> &[u8];
fn slen(&self) -> u64;
fn xlen(&self) -> u64;
fn sbuf(&self) -> &[u64];
fn xbuf(&self) -> &[u64];
fn squal(&self) -> &[u8] {
&[]
}
fn xqual(&self) -> &[u8] {
&[]
}
fn decode_s(&self, buf: &mut Vec<u8>) -> Result<()> {
self.bitsize()
.decode(self.sbuf(), self.slen() as usize, buf)?;
Ok(())
}
fn decode_x(&self, buf: &mut Vec<u8>) -> Result<()> {
self.bitsize()
.decode(self.xbuf(), self.xlen() as usize, buf)?;
Ok(())
}
fn sseq(&self) -> &[u8] {
unimplemented!("This record does not implement direct sequence access");
}
fn xseq(&self) -> &[u8] {
unimplemented!("This record does not implement direct sequence access");
}
fn decode_s_alloc(&self) -> Result<Vec<u8>> {
let mut buf = Vec::with_capacity(self.slen() as usize);
self.decode_s(&mut buf)?;
Ok(buf)
}
fn decode_x_alloc(&self) -> Result<Vec<u8>> {
let mut buf = Vec::with_capacity(self.xlen() as usize);
self.decode_x(&mut buf)?;
Ok(buf)
}
fn is_paired(&self) -> bool {
self.xlen() > 0
}
fn has_quality(&self) -> bool {
!self.squal().is_empty()
}
}