1use clap::{Parser, Subcommand, ValueEnum};
2use serde::{Deserialize, Serialize};
3use std::path::PathBuf;
4
5#[derive(Debug, Parser)]
6#[command(name = "jam")]
7#[command(bin_name = "jam")]
8#[command(version = "0.1.0-beta.1")]
9#[command(
10 about = "Just another (genomic) minhasher (jam), obviously blazingly fast",
11 long_about = "An optimized minhash implementation that focuses on quick scans for small sequences in large datasets."
12)]
13pub struct Cli {
14 #[command(subcommand)]
15 pub command: Commands,
16 #[arg(short, long, global = true, default_value = "1")]
18 pub threads: Option<usize>,
19 #[arg(short, long, global = true, default_value = "false")]
21 pub force: bool,
22}
23
24#[derive(ValueEnum, Debug, Clone)]
25pub enum OutputFormats {
26 Bin,
27 Sourmash,
29}
30
31#[derive(ValueEnum, Debug, Clone, Deserialize, Serialize)]
32pub enum HashAlgorithms {
33 Default, Ahash,
35 Xxhash,
36 Murmur3,
37}
38
39#[derive(Debug, Subcommand, Clone)]
40pub enum Commands {
41 #[command(arg_required_else_help = true)]
43 Sketch {
44 #[arg(value_parser = clap::value_parser!(std::path::PathBuf))]
46 input: Vec<PathBuf>,
47 #[arg(short, long)]
49 #[arg(value_parser = clap::value_parser!(std::path::PathBuf))]
50 output: Option<PathBuf>,
51 #[arg(short = 'k', long = "kmer-size", default_value = "21")]
53 kmer_size: u8,
54 #[arg(long)]
56 fscale: Option<u64>,
57 #[arg(long)]
59 kscale: Option<u64>,
60 #[arg(long)]
62 nmin: Option<u64>,
63 #[arg(long)]
65 nmax: Option<u64>,
66 #[arg(long, default_value = "bin")]
68 format: OutputFormats,
69 #[arg(long, default_value = "default")]
71 algorithm: HashAlgorithms,
72 #[arg(long)]
74 singleton: bool,
75 },
76 #[command(arg_required_else_help = true)]
78 Merge {
79 #[arg(value_parser = clap::value_parser!(std::path::PathBuf))]
81 inputs: Vec<PathBuf>,
82 #[arg(short, long, required = true)]
84 #[arg(value_parser = clap::value_parser!(std::path::PathBuf))]
85 output: PathBuf,
86 },
87 #[command(arg_required_else_help = true)]
90 Dist {
91 #[arg(short, long)]
93 input: PathBuf,
94 #[arg(short, long)]
96 database: Vec<PathBuf>,
97 #[arg(short, long)]
99 #[arg(value_parser = clap::value_parser!(std::path::PathBuf))]
100 output: Option<PathBuf>,
101 #[arg(short, long, default_value = "0.0")]
103 cutoff: f64,
104 #[arg(long)]
106 stats: bool,
107 #[arg(long)]
109 gc_lower: Option<u8>,
110 #[arg(long)]
112 gc_upper: Option<u8>,
113 },
114}