use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
use crate::format::SequenceFormat;
use crate::input::Input;
#[derive(Parser, Debug)]
#[command(name = "kmerust")]
#[command(version, author, about, long_about = None)]
pub struct Args {
#[arg(value_parser = parse_k)]
pub k: usize,
#[arg(default_value = "-")]
pub path: PathBuf,
#[arg(short, long, value_enum, default_value = "fasta")]
pub format: OutputFormat,
#[arg(short, long, default_value = "1")]
pub min_count: u64,
#[arg(short, long)]
pub quiet: bool,
#[arg(short = 'i', long = "input-format", value_enum, default_value = "auto")]
pub input_format: SequenceFormat,
#[arg(long)]
pub save: Option<PathBuf>,
#[arg(short = 'Q', long = "min-quality")]
pub min_quality: Option<u8>,
}
impl Args {
#[must_use]
pub fn input(&self) -> Input {
Input::from_path(&self.path)
}
#[must_use]
pub fn resolved_input_format(&self) -> SequenceFormat {
self.input_format.resolve(Some(&self.path))
}
}
#[derive(Debug, Clone, Copy, ValueEnum, Default)]
pub enum OutputFormat {
#[default]
Fasta,
Tsv,
Json,
Histogram,
}
fn parse_k(s: &str) -> Result<usize, String> {
let k: usize = s
.parse()
.map_err(|_| format!("'{s}' is not a valid number"))?;
if k == 0 {
return Err("k-mer length must be at least 1".to_string());
}
if k > 32 {
return Err("k-mer length must be at most 32".to_string());
}
Ok(k)
}
#[derive(Parser, Debug)]
#[command(name = "kmerust")]
#[command(
version,
author,
about = "A fast, parallel k-mer counter for DNA sequences"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Command>,
}
#[derive(Subcommand, Debug)]
pub enum Command {
Query(QueryArgs),
}
#[derive(Parser, Debug)]
pub struct QueryArgs {
pub index: PathBuf,
pub kmer: String,
}