use clap::{Parser, ValueEnum};
use std::path::PathBuf;
use std::str::FromStr;
use syn_select::Selector;
const PACKAGE_SELECTION: &str = "Package Selection";
const TARGET_SELECTION: &str = "Target Selection";
const FEATURE_SELECTION: &str = "Feature Selection";
const COMPILATION_OPTIONS: &str = "Compilation Options";
const MANIFEST_OPTIONS: &str = "Manifest Options";
#[derive(Parser)]
#[command(
bin_name = "cargo",
version,
author,
disable_help_subcommand = true,
styles = clap_cargo::style::CLAP_STYLING,
)]
pub enum Subcommand {
#[command(name = "expand", version, author, disable_version_flag = true)]
Expand(Expand),
}
#[derive(Parser, Debug)]
pub struct Expand {
#[arg(long)]
pub ugly: bool,
#[arg(long, value_name = "NAME")]
pub theme: Option<String>,
#[arg(long)]
pub themes: bool,
#[arg(long)]
pub verbose: bool,
#[arg(long, value_name = "WHEN", hide_possible_values = true)]
pub color: Option<Coloring>,
#[arg(long, value_name = "KEY=VALUE")]
pub config: Vec<String>,
#[arg(short = 'Z', value_name = "FLAG")]
pub unstable_flags: Vec<String>,
#[arg(long)]
pub version: bool,
#[arg(short, long, value_name = "SPEC", num_args = 0..=1, help_heading = PACKAGE_SELECTION)]
pub package: Option<Option<String>>,
#[arg(long, help_heading = TARGET_SELECTION)]
pub lib: bool,
#[arg(long, value_name = "NAME", num_args = 0..=1, help_heading = TARGET_SELECTION)]
pub bin: Option<Option<String>>,
#[arg(long, value_name = "NAME", num_args = 0..=1, help_heading = TARGET_SELECTION)]
pub example: Option<Option<String>>,
#[arg(long, value_name = "NAME", num_args = 0..=1, help_heading = TARGET_SELECTION)]
pub test: Option<Option<String>>,
#[arg(long, help_heading = TARGET_SELECTION)]
pub tests: bool,
#[arg(long, value_name = "NAME", num_args = 0..=1, help_heading = TARGET_SELECTION)]
pub bench: Option<Option<String>>,
#[arg(short = 'F', long, value_name = "FEATURES", help_heading = FEATURE_SELECTION)]
pub features: Option<String>,
#[arg(long, help_heading = FEATURE_SELECTION)]
pub all_features: bool,
#[arg(long, help_heading = FEATURE_SELECTION)]
pub no_default_features: bool,
#[arg(short, long, value_name = "N", help_heading = COMPILATION_OPTIONS)]
pub jobs: Option<u64>,
#[arg(long, help_heading = COMPILATION_OPTIONS)]
pub release: bool,
#[arg(long, value_name = "PROFILE-NAME", help_heading = COMPILATION_OPTIONS)]
pub profile: Option<String>,
#[arg(long, value_name = "TARGET", help_heading = COMPILATION_OPTIONS)]
pub target: Option<String>,
#[arg(long, value_name = "DIRECTORY", help_heading = COMPILATION_OPTIONS)]
pub target_dir: Option<PathBuf>,
#[arg(long, value_name = "PATH", help_heading = MANIFEST_OPTIONS)]
pub manifest_path: Option<PathBuf>,
#[arg(long, help_heading = MANIFEST_OPTIONS)]
pub frozen: bool,
#[arg(long, help_heading = MANIFEST_OPTIONS)]
pub locked: bool,
#[arg(long, help_heading = MANIFEST_OPTIONS)]
pub offline: bool,
#[arg(value_name = "ITEM", value_parser = parse_selector)]
pub item: Option<Selector>,
}
#[derive(ValueEnum, Debug, Clone, Copy)]
pub enum Coloring {
Auto,
Always,
Never,
}
fn parse_selector(s: &str) -> Result<Selector, <Selector as FromStr>::Err> {
if s.starts_with("::") {
s[2..].parse()
} else {
s.parse()
}
}
#[test]
fn test_cli() {
<Subcommand as clap::CommandFactory>::command().debug_assert();
}