vcfkit 0.1.1

vcfkit: a simple program for vcf/bcf file manipulation
use colored::*;
use rust_htslib::bcf::{header::Header, Format, Read, Reader, Writer};
use rust_htslib::errors::Error;

pub fn select_sites(
    vcf: &Option<&str>,
    keep: &str,
    gzip: bool,
    out: &Option<&str>,
) -> Result<(), Error> {
    let mut bcf = if let Some(file) = vcf {
        Reader::from_path(file)?
    } else {
        Reader::from_stdin()?
    };

    let header1 = bcf.header();
    let header2 = Header::from_template(&header1);

    let mut bcf_writer = if let Some(file) = out {
        Writer::from_path(file, &header2, !gzip, Format::Vcf)?
    } else {
        Writer::from_stdout(&header2, !gzip, Format::Vcf)?
    };

    let mut flag_snp = 0;
    if keep == "SNP" {
        for rec in bcf.records() {
            if let Ok(ref info) = rec {
                for allele in info.alleles() {
                    if allele.len() == 1 {
                        continue;
                    } else {
                        flag_snp += 1;
                    }
                }
            }
            if flag_snp == 0 {
                bcf_writer.write(&rec?)?;
            }
            flag_snp = 0;
        }
    } else if keep == "INDEL" {
        for rec in bcf.records() {
            if let Ok(ref info) = rec {
                for allele in info.alleles() {
                    if allele.len() == 1 {
                        continue;
                    } else {
                        flag_snp += 1;
                    }
                }
            }
            if flag_snp != 0 {
                bcf_writer.write(&rec?)?;
            }
            flag_snp = 0;
        }
    } else {
        eprintln!(
            "{}",
            "[error]: invalid  arg '--keep', must be INDEL or SNP !".red()
        );
        std::process::exit(1);
    }

    Ok(())
}