tidyvcf 0.7.3

command-line tool to convert VCF files to tab/comma separated tables
Documentation
use noodles::vcf::header::Header;

use std::error::Error;

use crate::{
    consts::{DEFAULT_CSQ_OVERFLOW_FIELDNAME, DEFAULT_SAMPLE_STRING, MAIN_COLUMNS, VEP_FIELD_NAME},
    utils::split_header_csq_fields,
};

use crate::cli::Opt;

pub fn main_fields_strings(opt: &Opt) -> Vec<String> {
    let mut fields: Vec<String> = Vec::new();
    for col in MAIN_COLUMNS {
        if opt.include_column(col) {
            fields.push(col.to_owned());
        }
    }
    fields
}

pub fn info_fields_strings(
    fields: &mut Vec<String>,
    hdr: &Header,
    opt: &Opt,
) -> Result<usize, Box<dyn Error>> {
    let mut vep_fields_splitn = 0;
    for key in hdr.infos().keys() {
        if opt.vep_fields && key == VEP_FIELD_NAME {
            let csq_string = hdr
                .infos()
                .get(key)
                .ok_or("VEP field missing!")?
                .description();
            let mut csq_fields = split_header_csq_fields(csq_string);
            csq_fields.push(DEFAULT_CSQ_OVERFLOW_FIELDNAME.to_owned());
            vep_fields_splitn = csq_fields.len();
            for csq_field in csq_fields {
                fields.push(format!("{}{}", opt.vep_prefix, csq_field));
            }
        } else if opt.include_info_column(key.as_ref()) {
            fields.push(format!("{}{}", opt.info_prefix, key));
        }
    }
    Ok(vep_fields_splitn)
}

pub fn format_fields_strings(
    fields: &mut Vec<String>,
    hdr: &Header,
    opt: &Opt,
    samples: Vec<String>,
) {
    let mut added = Vec::new();

    for key in hdr.formats().keys() {
        if opt.include_column(key.as_ref()) {
            added.push(key.to_string());
        }
    }
    if opt.stack {
        added.push(DEFAULT_SAMPLE_STRING.to_owned());
        fields.append(&mut added);
    } else {
        for sample in samples {
            for field in &added {
                fields.push(format!("{}{}{}", &sample, &opt.format_delim, field));
            }
        }
    }
}