use crate::{BinseqRecord, Result};
pub const DEFAULT_QUALITY: u8 = b'?';
#[derive(Clone, Debug, Default)]
pub struct Context {
sbuf: Vec<u8>,
xbuf: Vec<u8>,
sheader: Vec<u8>,
xheader: Vec<u8>,
squal: Vec<u8>,
xqual: Vec<u8>,
}
impl Context {
#[must_use]
pub fn sbuf(&self) -> &[u8] {
&self.sbuf
}
pub fn sbuf_mut(&mut self) -> &mut Vec<u8> {
&mut self.sbuf
}
#[must_use]
pub fn xbuf(&self) -> &[u8] {
&self.xbuf
}
pub fn xbuf_mut(&mut self) -> &mut Vec<u8> {
&mut self.xbuf
}
#[must_use]
pub fn sheader(&self) -> &[u8] {
&self.sheader
}
pub fn sheader_mut(&mut self) -> &mut Vec<u8> {
&mut self.sheader
}
#[must_use]
pub fn xheader(&self) -> &[u8] {
&self.xheader
}
pub fn xheader_mut(&mut self) -> &mut Vec<u8> {
&mut self.xheader
}
#[must_use]
pub fn squal(&self) -> &[u8] {
&self.squal
}
pub fn squal_mut(&mut self) -> &mut Vec<u8> {
&mut self.squal
}
#[must_use]
pub fn xqual(&self) -> &[u8] {
&self.xqual
}
pub fn xqual_mut(&mut self) -> &mut Vec<u8> {
&mut self.xqual
}
pub fn clear(&mut self) {
self.sbuf.clear();
self.xbuf.clear();
self.sheader.clear();
self.xheader.clear();
self.squal.clear();
self.xqual.clear();
}
pub fn fill_missing_squal(&mut self) {
if self.squal.len() != self.sbuf.len() {
self.squal.clear();
self.squal.resize(self.sbuf.len(), DEFAULT_QUALITY);
}
}
pub fn fill_missing_xqual(&mut self) {
if self.xqual.len() != self.xbuf.len() {
self.xqual.clear();
self.xqual.resize(self.xbuf.len(), DEFAULT_QUALITY);
}
}
pub fn fill_sequences<R: BinseqRecord>(&mut self, record: R) -> Result<()> {
self.clear();
{
record.decode_s(&mut self.sbuf)?;
}
if record.is_paired() {
record.decode_x(&mut self.xbuf)?;
}
Ok(())
}
pub fn fill<R: BinseqRecord>(&mut self, record: R) -> Result<()> {
self.clear();
{
record.decode_s(&mut self.sbuf)?;
record.sheader(&mut self.sheader);
self.squal.extend_from_slice(record.squal());
if self.squal.is_empty() {
self.fill_missing_squal();
}
}
if record.is_paired() {
record.decode_x(&mut self.xbuf)?;
record.xheader(&mut self.xheader);
self.xqual.extend_from_slice(record.xqual());
if self.xqual.is_empty() {
self.fill_missing_xqual();
}
}
Ok(())
}
}