segul 0.23.2

An ultrafast and memory-efficient tool for phylogenomics
Documentation
use crate::core::align::partition::PartitionConverter;
use crate::helper::partition::construct_partition_path;
use crate::helper::types::PartitionFmt;
use crate::helper::{logger, utils};

use crate::cli::args::align::PartitionArgs;
use crate::cli::{AlignSeqInput, ConcatCli, InputCli, OutputCli};

impl InputCli for PartParser<'_> {}
impl ConcatCli for PartParser<'_> {}
impl OutputCli for PartParser<'_> {}
impl AlignSeqInput for PartParser<'_> {}

pub(in crate::cli) struct PartParser<'a> {
    args: &'a PartitionArgs,
}

impl<'a> PartParser<'a> {
    pub(in crate::cli) fn new(args: &'a PartitionArgs) -> Self {
        Self { args }
    }

    pub(in crate::cli) fn convert(&self) {
        let inputs = self.collect_paths(&self.args.input);
        let input_counts = inputs.len();
        let in_part_fmt = if let Some(part_fmt) = &self.args.part_fmt {
            self.parse_partition_fmt_std(part_fmt)
        } else {
            PartitionFmt::Charset
        };
        let datatype = self.parse_datatype(&self.args.in_fmt.datatype);
        let out_part_fmt = self.parse_partition_fmt(&self.args.out_part, self.args.codon);

        inputs.iter().for_each(|input| {
            logger::log_input_partition(Some(input), input_counts);
            let output = construct_partition_path(input, &out_part_fmt);
            self.check_output_file_exist(&output, self.args.force);
            let converter = PartitionConverter::new(input, &in_part_fmt, &output, &out_part_fmt);
            converter.convert(&datatype, self.args.skip_checking);
            if input_counts > 1 {
                utils::print_divider();
            }
        });
    }
}