use std::path::PathBuf;
use clap::ArgMatches;
use crate::cli::{InputCli, InputPrint, OutputCli};
use crate::handler::summarize::SeqStats;
use crate::helper::types::{DataType, InputFmt};
impl InputCli for SummaryParser<'_> {}
impl InputPrint for SummaryParser<'_> {}
impl OutputCli for SummaryParser<'_> {}
pub(in crate::cli) struct SummaryParser<'a> {
matches: &'a ArgMatches,
interval: usize,
input_fmt: InputFmt,
datatype: DataType,
input_dir: Option<PathBuf>,
}
impl<'a> SummaryParser<'a> {
pub(in crate::cli) fn new(matches: &'a ArgMatches) -> Self {
Self {
matches,
interval: 0,
input_fmt: InputFmt::Fasta,
datatype: DataType::Dna,
input_dir: None,
}
}
pub(in crate::cli) fn stats(&mut self) {
self.input_fmt = self.parse_input_fmt(self.matches);
self.interval = self.parse_interval();
self.datatype = self.parse_datatype(self.matches);
let prefix = self.parse_prefix();
let task_desc = "Sequence summary statistics";
let files = if self.matches.is_present("dir") {
let dir = self.parse_dir_input(self.matches);
self.input_dir = Some(PathBuf::from(dir));
self.get_files(dir, &self.input_fmt)
} else {
self.parse_input(self.matches)
};
self.print_input::<PathBuf>(
&self.input_dir,
task_desc,
files.len(),
&self.input_fmt,
&self.datatype,
);
let output = self.parse_output(self.matches);
let is_overwrite = self.parse_overwrite_opts(self.matches);
self.check_output_dir_exist(&output, is_overwrite);
let mut summary = SeqStats::new(&self.input_fmt, &output, self.interval, &self.datatype);
if self.matches.is_present("per-locus") {
summary.summarize_locus(&files, &prefix);
} else {
summary.summarize_all(&files, &prefix);
};
}
fn parse_prefix(&self) -> Option<String> {
if self.matches.is_present("prefix") {
Some(
self.matches
.value_of("prefix")
.expect("Failed parsing prefix input")
.to_string(),
)
} else {
None
}
}
fn parse_interval(&self) -> usize {
let interval = self
.matches
.value_of("percent-interval")
.expect("Failed parsing the interval command");
interval
.parse::<usize>()
.expect("Failed parsing interval values to integer")
}
}