use clap::{command, ArgAction, Parser, Subcommand};
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
pub struct Args {
#[command(subcommand)]
pub command: Commands,
#[arg(short = 'm', long)]
pub max_memory: Option<usize>,
#[arg(short = 't', long, default_value = "1", global = true)]
pub threads: usize,
#[arg(long, action = ArgAction::SetTrue, global = true)]
pub quiet: bool,
#[arg(short = 'f', long, action = ArgAction::SetTrue, global = true)]
pub force: bool,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
#[clap(arg_required_else_help = true)]
Extract {
#[clap(flatten)]
input_fastqs: InputsGroup,
#[clap(flatten)]
output_fastqs: OutputsGroup,
#[clap(flatten)]
patterns: PatternsGroup,
#[clap(flatten)]
compression: CompressionGroup,
#[clap(flatten)]
additional_params: AdditionalParamsGroup,
},
}
#[derive(Debug, clap::Args)]
pub struct InputsGroup {
#[arg(short = '1', long, value_name = "IN_FASTQ1", requires = "out_fq1")]
pub fq1: String,
#[arg(short = '2', long, value_name = "IN_FASTQ2", requires_all = ["fq1", "out_fq2"])]
pub fq2: Option<String>,
}
#[derive(Debug, clap::Args)]
pub struct OutputsGroup {
#[arg(short = 'o', long, value_name = "OUT_FASTQ1")]
pub out_fq1: String,
#[arg(short = 'O', long, value_name = "OUT_FASTQ2", requires = "out_fq1")]
pub out_fq2: Option<String>,
}
#[derive(Debug, clap::Args)]
#[group(required = true, multiple = true)]
pub struct PatternsGroup {
#[arg(short = 'p', long, requires = "fq1")]
pub pattern1: Option<String>,
#[arg(short = 'P', long, requires = "fq2")]
pub pattern2: Option<String>,
}
#[derive(Debug, clap::Args)]
pub struct CompressionGroup {
#[arg(long, action = ArgAction::SetTrue, conflicts_with_all = ["bgz", "mgz", "lz4"])]
pub gz: bool,
#[arg(long, action = ArgAction::SetTrue, conflicts_with_all = ["gz", "mgz", "lz4"])]
pub bgz: bool,
#[arg(long, action = ArgAction::SetTrue, conflicts_with_all = ["gz", "bgz", "lz4"])]
pub mgz: bool,
#[arg(long, action = ArgAction::SetTrue, conflicts_with_all = ["gz", "bgz", "mgz"])]
pub lz4: bool,
}
#[derive(Debug, clap::Args)]
pub struct AdditionalParamsGroup {
#[arg(short = 'r', long, action=ArgAction::SetTrue)]
pub rc_barcodes: bool,
#[arg(short = 's', long, action=ArgAction::SetTrue)]
pub skip_trimming: bool,
#[arg(short = 'e', long, default_value = "1")]
pub max_error: usize,
}