segul 0.23.2

An ultrafast and memory-efficient tool for phylogenomics
Documentation
use std::path::PathBuf;

use crate::core::sequence::id::SequenceID;
use crate::helper::logger::AlignSeqLogger;

use crate::cli::args::sequence::SequenceIdArgs;
use crate::cli::{collect_paths, AlignSeqInput, InputCli, OutputCli};

impl InputCli for IdParser<'_> {}
impl OutputCli for IdParser<'_> {}
impl AlignSeqInput for IdParser<'_> {}

pub(in crate::cli) struct IdParser<'a> {
    args: &'a SequenceIdArgs,
    input_dir: Option<PathBuf>,
}

impl<'a> IdParser<'a> {
    pub(in crate::cli) fn new(args: &'a SequenceIdArgs) -> Self {
        Self {
            args,
            input_dir: None,
        }
    }

    pub(in crate::cli) fn extract(&mut self) {
        let input_fmt = self.parse_input_fmt(&self.args.in_fmt.input_fmt);
        let datatype = self.parse_datatype(&self.args.in_fmt.datatype);
        let dir = &self.args.io.dir;
        let files = collect_paths!(self, dir, input_fmt);
        let log = AlignSeqLogger::new(
            self.input_dir.as_deref(),
            &input_fmt,
            &datatype,
            files.len(),
        );
        let id = SequenceID::new(
            &files,
            &input_fmt,
            &datatype,
            &self.args.output,
            self.args.prefix.as_deref(),
        );
        if self.args.map {
            let task = "Sequence ID Mapping";
            log.log(task);
            self.check_output_dir_exist(&self.args.output, self.args.io.force);
            id.map_id();
        } else {
            let task = "Sequence ID Generation";
            log.log(task);
            self.check_output_dir_exist(&self.args.output, self.args.io.force);
            id.get_unique();
        }
    }
}