use anyhow::Result;
use clap::{Parser, Subcommand, ValueEnum};
use libsail::format::Format;
use crate::commands::cat::CatArgs;
use crate::commands::count::CountArgs;
use crate::commands::dedup::DedupArgs;
use crate::commands::fetch::FetchArgs;
use crate::commands::filter::FilterArgs;
use crate::commands::get::GetArgs;
use crate::commands::grep::GrepArgs;
use crate::commands::head::HeadArgs;
use crate::commands::index::IndexArgs;
use crate::commands::names::NamesArgs;
use crate::commands::reformat::ReformatArgs;
use crate::commands::rename::RenameArgs;
use crate::commands::sample::SampleArgs;
use crate::commands::shuffle::ShuffleArgs;
use crate::commands::sort::SortArgs;
use crate::commands::split::SplitArgs;
use crate::commands::stats::StatsArgs;
use crate::commands::tail::TailArgs;
use crate::commands::validate::ValidateArgs;
#[derive(Parser)]
#[command(name = "sail", version, about = "sequence analysis I/O tool")]
pub struct Cli {
#[command(subcommand)]
command: Command,
}
impl Cli {
pub fn run(self) -> Result<()> {
match self.command {
Command::Cat(args) => args.run(),
Command::Count(args) => args.run(),
Command::Dedup(args) => args.run(),
Command::Fetch(args) => args.run(),
Command::Filter(args) => args.run(),
Command::Get(args) => args.run(),
Command::Grep(args) => args.run(),
Command::Head(args) => args.run(),
Command::Index(args) => args.run(),
Command::Names(args) => args.run(),
Command::Reformat(args) => args.run(),
Command::Rename(args) => args.run(),
Command::Sample(args) => args.run(),
Command::Shuffle(args) => args.run(),
Command::Sort(args) => args.run(),
Command::Split(args) => args.run(),
Command::Stats(args) => args.run(),
Command::Tail(args) => args.run(),
Command::Validate(args) => args.run(),
}
}
}
#[derive(Subcommand)]
enum Command {
Cat(CatArgs),
Count(CountArgs),
Dedup(DedupArgs),
Fetch(FetchArgs),
Filter(FilterArgs),
Get(GetArgs),
Grep(GrepArgs),
Head(HeadArgs),
Index(IndexArgs),
Names(NamesArgs),
Reformat(ReformatArgs),
Rename(RenameArgs),
Sample(SampleArgs),
Shuffle(ShuffleArgs),
Sort(SortArgs),
Split(SplitArgs),
Stats(StatsArgs),
Tail(TailArgs),
Validate(ValidateArgs),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)]
pub enum FormatArg {
Fasta,
Stockholm,
Hmm,
}
impl From<FormatArg> for Format {
fn from(arg: FormatArg) -> Format {
match arg {
FormatArg::Fasta => Format::Fasta,
FormatArg::Stockholm => Format::Stockholm,
FormatArg::Hmm => Format::Hmm,
}
}
}
#[derive(clap::Args, Clone, Copy, Debug, Default)]
#[command(next_help_heading = "Input")]
pub struct ReadArgs {
#[arg(long = "read", value_enum, default_value_t, value_name = "MODE")]
pub mode: Mode,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, ValueEnum)]
pub enum Mode {
#[default]
Auto,
Stream,
Memory,
Indexed,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, ValueEnum)]
pub enum Order {
#[default]
File,
Asked,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, ValueEnum)]
pub enum Axis {
Depth,
Width,
}