wax-dig 0.1.2

CLI for digging through public music discovery signals from Bandcamp and SoundCloud
Documentation
use std::path::PathBuf;

use clap::{Args, Parser, Subcommand, ValueEnum};

#[derive(Debug, Parser)]
#[command(
    name = "wax",
    version,
    about = "Dig through public Bandcamp collector overlap"
)]
pub struct Cli {
    #[arg(long, global = true)]
    pub config: Option<PathBuf>,
    #[arg(long, global = true)]
    pub cache_dir: Option<PathBuf>,
    #[arg(long, global = true)]
    pub json: bool,
    #[arg(long, global = true)]
    pub csv: bool,
    #[arg(long, short, global = true)]
    pub verbose: bool,
    #[arg(long, global = true)]
    pub quiet: bool,
    #[arg(long, global = true)]
    pub user_agent: Option<String>,
    #[arg(long, global = true)]
    pub rate_limit_ms: Option<u64>,
    #[arg(long, global = true)]
    pub concurrency: Option<usize>,
    #[arg(long, global = true)]
    pub timeout_ms: Option<u64>,
    #[command(subcommand)]
    pub command: Commands,
}

#[derive(Debug, Subcommand)]
pub enum Commands {
    Resolve {
        album_url: String,
    },
    Collectors(DigArgs),
    Library {
        fan_url: String,
        #[arg(long, default_value_t = 50)]
        limit: usize,
    },
    Dig(DigArgs),
    Cache {
        #[command(subcommand)]
        command: CacheCommands,
    },
}

#[derive(Debug, Subcommand)]
pub enum CacheCommands {
    Stats,
    Clear,
}

#[derive(Debug, Clone, Args)]
pub struct DigArgs {
    pub album_url: String,
    #[arg(long, default_value_t = 75)]
    pub max_collectors: usize,
    #[arg(long, default_value_t = 1)]
    pub max_depth: usize,
    #[arg(long, default_value_t = 25)]
    pub limit: usize,
    #[arg(long, value_enum, default_value_t = SampleMode::Top)]
    pub sample: SampleMode,
    #[arg(long, default_value_t = 2)]
    pub min_overlap: usize,
    #[arg(long)]
    pub exclude_artist: bool,
    #[arg(long)]
    pub exclude_label: bool,
    #[arg(long)]
    pub tag: Vec<String>,
    #[arg(long, value_enum, default_value_t = SortMode::Score)]
    pub sort: SortMode,
}

#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum SampleMode {
    Top,
    Random,
}

#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum SortMode {
    Score,
    Overlap,
}