use std::{env, path::PathBuf};
use clap::{ColorChoice, Parser as _};
use clap_verbosity_flag::{InfoLevel, Verbosity};
pub(crate) fn parse() -> Args {
let args = env::args().enumerate().filter_map(|(idx, arg)| {
if idx == 1 && arg == "sync-rdme" {
None
} else {
Some(arg)
}
});
Args::parse_from(args)
}
#[derive(Debug, Clone, Default, clap::Parser)]
#[command(
name = "cargo-sync-rdme",
bin_name = "cargo sync-rdme",
version,
styles = clap_cargo::style::CLAP_STYLING
)]
pub(crate) struct Args {
#[command(flatten)]
pub(crate) verbosity: Verbosity<InfoLevel>,
#[arg(long, default_value_t = ColorChoice::Auto, value_name = "WHEN")]
pub(crate) color: ColorChoice,
#[command(flatten)]
pub(crate) toolchain: RustdocToolchainArgs,
#[command(flatten)]
pub(crate) mode: ModeArgs,
#[command(flatten)]
pub(crate) fix: FixArgs,
#[command(flatten, next_help_heading = "Package Selection")]
pub(crate) package: PackageSelection,
#[command(flatten, next_help_heading = "Feature Selection")]
pub(crate) feature: FeatureSelection,
#[command(flatten, next_help_heading = "Manifest Options")]
pub(crate) manifest: ManifestOptions,
}
#[derive(Debug, Clone, Default, clap::Args)]
pub(crate) struct ManifestOptions {
#[arg(long, short = 'm', value_name = "PATH")]
pub(crate) manifest_path: Option<PathBuf>,
}
#[derive(Debug, Clone, Default, clap::Args)]
pub(crate) struct PackageSelection {
#[arg(long)]
pub(crate) workspace: bool,
#[arg(long = "package", short = 'p', value_name = "SPEC")]
pub(crate) packages: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, clap::Args)]
pub(crate) struct FeatureSelection {
#[arg(long, short = 'F', value_name = "FEATURES")]
pub(crate) features: Vec<String>,
#[arg(long)]
pub(crate) all_features: bool,
#[arg(long)]
pub(crate) no_default_features: bool,
}
#[derive(Debug, Clone, Default, clap::Args)]
pub(crate) struct RustdocToolchainArgs {
#[arg(long)]
pub(crate) toolchain: Option<String>,
#[arg(long)]
pub(crate) install_toolchain: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum Mode {
Check,
Fix,
}
#[derive(Debug, Clone, Default, clap::Args)]
pub(crate) struct ModeArgs {
#[arg(long)]
check: bool,
}
impl ModeArgs {
pub(crate) fn mode(&self) -> Mode {
if self.check { Mode::Check } else { Mode::Fix }
}
}
#[derive(Debug, Clone, Default, clap::Args)]
pub(crate) struct FixArgs {
#[arg(long)]
pub(crate) allow_no_vcs: bool,
#[arg(long)]
pub(crate) allow_dirty: bool,
#[arg(long)]
pub(crate) allow_staged: bool,
}
#[cfg(test)]
mod tests {
use clap::CommandFactory as _;
use super::*;
#[test]
fn verify_args() {
Args::command().debug_assert();
}
}