vcfkit 0.1.0

vcfkit: a simple program for vcf/bcf file manipulation
use std::collections::HashMap;
use std::path::Path;

use rust_htslib::{
    bcf::{header::Header, Format, Read, Reader, Writer},
    errors::Error,
};

pub fn split_by_chr(
    vcf: &Option<&str>, 
    outdir: &str
) -> Result<(), Error> {
    let mut bcf = if let Some(file) = vcf {
        Reader::from_path(file)?
    } else {
        Reader::from_stdin()?
    };
    let header = Header::from_template(&bcf.header());
    let mut chr_hash = HashMap::new();
    for rec in bcf.records() {
        let chr: String = if let Ok(ref record) = rec {
            let name = String::from_utf8(record.header().rid2name(record.rid().unwrap())?.to_vec())
                .unwrap();
            chr_hash.entry(name.clone()).or_insert(Writer::from_path(
                Path::new(&format!("{}/{}.vcf.gz", outdir, name)),
                &header,
                false,
                Format::Vcf,
            )?);
            name
        } else {
            eprintln!(
                "[error]: fail to get chromosome name at pos: {}",
                rec.unwrap().pos() + 1
            );
            std::process::exit(1);
        };
        if let Some(bcf_writer) = chr_hash.get_mut(&chr) {
            bcf_writer.write(&rec?)?;
        }
    }
    Ok(())
}