1use std::path::PathBuf;
2
3use clap::{Args, Parser, Subcommand, ValueEnum};
4
5#[derive(Debug, Parser)]
6#[command(
7 name = "wax",
8 version,
9 about = "Dig through public Bandcamp collector overlap"
10)]
11pub struct Cli {
12 #[arg(long, global = true)]
13 pub config: Option<PathBuf>,
14 #[arg(long, global = true)]
15 pub cache_dir: Option<PathBuf>,
16 #[arg(long, global = true)]
17 pub json: bool,
18 #[arg(long, global = true)]
19 pub csv: bool,
20 #[arg(long, short, global = true)]
21 pub verbose: bool,
22 #[arg(long, global = true)]
23 pub quiet: bool,
24 #[arg(long, global = true)]
25 pub user_agent: Option<String>,
26 #[arg(long, global = true)]
27 pub rate_limit_ms: Option<u64>,
28 #[arg(long, global = true)]
29 pub concurrency: Option<usize>,
30 #[arg(long, global = true)]
31 pub timeout_ms: Option<u64>,
32 #[command(subcommand)]
33 pub command: Commands,
34}
35
36#[derive(Debug, Subcommand)]
37pub enum Commands {
38 Resolve {
39 album_url: String,
40 },
41 Collectors(DigArgs),
42 Library {
43 fan_url: String,
44 #[arg(long, default_value_t = 50)]
45 limit: usize,
46 },
47 Dig(DigArgs),
48 Cache {
49 #[command(subcommand)]
50 command: CacheCommands,
51 },
52}
53
54#[derive(Debug, Subcommand)]
55pub enum CacheCommands {
56 Stats,
57 Clear,
58}
59
60#[derive(Debug, Clone, Args)]
61pub struct DigArgs {
62 pub album_url: String,
63 #[arg(long, default_value_t = 75)]
64 pub max_collectors: usize,
65 #[arg(long, default_value_t = 1)]
66 pub max_depth: usize,
67 #[arg(long, default_value_t = 25)]
68 pub limit: usize,
69 #[arg(long, value_enum, default_value_t = SampleMode::Top)]
70 pub sample: SampleMode,
71 #[arg(long, default_value_t = 2)]
72 pub min_overlap: usize,
73 #[arg(long)]
74 pub exclude_artist: bool,
75 #[arg(long)]
76 pub exclude_label: bool,
77 #[arg(long)]
78 pub tag: Vec<String>,
79 #[arg(long, value_enum, default_value_t = SortMode::Score)]
80 pub sort: SortMode,
81}
82
83#[derive(Debug, Clone, Copy, ValueEnum)]
84pub enum SampleMode {
85 Top,
86 Random,
87}
88
89#[derive(Debug, Clone, Copy, ValueEnum)]
90pub enum SortMode {
91 Score,
92 Overlap,
93}