Skip to main content

wax/
cli.rs

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}