#![warn(missing_docs)]
use rust_htslib::bam::header::{Header, HeaderRecord};
#[derive(Debug)]
pub struct SequenceDict {
pub sequences: Vec<SequenceData>,
}
#[derive(Debug)]
pub struct SequenceData {
pub name: String,
pub length: usize,
}
impl From<SequenceData> for HeaderRecord<'_> {
fn from(meta: SequenceData) -> Self {
let mut rec = HeaderRecord::new("SQ".as_bytes());
rec.push_tag("SN".as_bytes(), &meta.name);
rec.push_tag("LN".as_bytes(), meta.length);
rec
}
}
impl Default for SequenceDict {
fn default() -> Self {
let sequences = (1..22)
.map(|chr| chr.to_string())
.chain(vec!["X", "Y", "M"].into_iter().map(|chr| chr.to_string()))
.map(|chr| SequenceData {
name: format!("chr{}", chr),
length: 2_000_000,
})
.collect();
SequenceDict { sequences }
}
}
impl From<SequenceDict> for Header {
fn from(meta: SequenceDict) -> Header {
let mut header = Header::new();
for seq in meta.sequences.into_iter() {
header.push_record(&seq.into());
}
header
}
}