use clap::Subcommand;
#[derive(Subcommand)]
pub enum Commands {
Init {
#[arg(short, long)]
force: bool,
#[arg(short, long)]
project: bool,
},
Status,
Update {
#[arg(long, default_value = "stable")]
channel: String,
#[arg(short, long)]
rules_only: bool,
#[arg(short, long)]
dry_run: bool,
},
Config {
#[command(subcommand)]
command: Option<ConfigCommand>,
},
Validate {
path: Option<std::path::PathBuf>,
#[arg(long)]
ai_report: bool,
#[arg(long)]
compare_previous: bool,
#[arg(long)]
locked_only: bool,
},
Rollback {
version: String,
},
Uninstall {
#[arg(short, long)]
confirm: bool,
},
Rust {
#[command(subcommand)]
command: RustCommand,
},
Edition {
#[command(subcommand)]
command: EditionCommand,
},
Safety {
#[command(subcommand)]
command: SafetyCommand,
},
Template {
#[command(subcommand)]
command: template::TemplateCommand,
},
Fix {
path: Option<std::path::PathBuf>,
#[arg(long)]
only: Option<String>,
#[arg(long)]
skip: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long)]
limit: Option<usize>,
#[arg(long)]
ai_analysis: bool,
},
}
#[derive(Subcommand)]
pub enum RustCommand {
Check {
#[arg(short, long)]
verbose: bool,
#[arg(long)]
enforce: bool,
},
Recommend {
#[arg(short, long)]
stable_only: bool,
},
List {
#[arg(short, long, default_value = "10")]
count: usize,
#[arg(long)]
toolchains: bool,
},
Releases {
#[arg(short, long, default_value = "10")]
count: usize,
},
CheckUpdates {
#[arg(short, long)]
verbose: bool,
},
ReleaseNotes {
version: String,
#[arg(short, long)]
detailed: bool,
},
Security {
#[arg(long)]
fail_on_issues: bool,
},
Update {
#[arg(long)]
dry_run: bool,
#[arg(short, long)]
yes: bool,
#[arg(long)]
self_update: bool,
},
InstallToolchain {
channel: String,
#[arg(short, long)]
default: bool,
},
UninstallToolchain {
channel: String,
},
Switch {
channel: String,
},
}
#[derive(Subcommand)]
pub enum EditionCommand {
Check {
#[arg(default_value = ".")]
path: std::path::PathBuf,
},
Migrate {
#[arg(default_value = "2024")]
edition: String,
#[arg(long)]
no_backup: bool,
#[arg(long)]
test: bool,
#[arg(long)]
idioms: bool,
},
Analyze {
#[arg(default_value = ".")]
path: std::path::PathBuf,
#[arg(default_value = "2024")]
edition: String,
},
}
#[derive(Subcommand)]
pub enum SafetyCommand {
Status,
Install {
#[arg(short, long)]
force: bool,
#[arg(default_value = ".")]
path: std::path::PathBuf,
#[arg(long)]
cargo: bool,
},
Check {
#[arg(long, default_value = "pre-commit")]
stage: String,
#[arg(default_value = ".")]
path: std::path::PathBuf,
#[arg(short, long)]
verbose: bool,
},
Test {
#[arg(default_value = ".")]
path: std::path::PathBuf,
},
Bypass {
#[arg(long, value_enum)]
stage: SafetyBypassStage,
#[arg(long)]
reason: String,
#[arg(long, default_value = "24")]
duration: u64,
#[arg(long)]
user: Option<String>,
},
Audit {
#[arg(short, long, default_value = "20")]
limit: usize,
},
CheckBypass {
#[arg(long, value_enum)]
stage: SafetyBypassStage,
},
Uninstall {
#[arg(default_value = ".")]
path: std::path::PathBuf,
#[arg(short, long)]
confirm: bool,
},
Config {
#[arg(long, group = "config_action")]
show: bool,
#[arg(long, group = "config_action")]
set: Option<String>,
#[arg(long, group = "config_action")]
get: Option<String>,
},
Report {
#[arg(short, long, default_value = "10")]
last: usize,
#[arg(long)]
audit: bool,
#[arg(long)]
stage: Option<String>,
},
Stats {
#[arg(short, long, default_value = "30")]
days: u32,
},
}
#[derive(clap::ValueEnum, Clone, Debug)]
pub enum SafetyBypassStage {
PreCommit,
PrePush,
Publish,
}
impl SafetyBypassStage {
pub fn to_pipeline_stage(&self) -> crate::safety::PipelineStage {
match self {
Self::PreCommit => crate::safety::PipelineStage::PreCommit,
Self::PrePush => crate::safety::PipelineStage::PrePush,
Self::Publish => crate::safety::PipelineStage::Publish,
}
}
}
#[derive(Subcommand)]
pub enum ConfigCommand {
Get {
key: String,
},
Set {
value: String,
},
List,
Reset,
Sources,
Migrate,
Lock {
key: String,
#[arg(long)]
value: Option<String>,
#[arg(long)]
reason: String,
#[arg(long, default_value = "project")]
level: ConfigLevelArg,
},
Unlock {
key: String,
#[arg(long)]
reason: String,
#[arg(long, default_value = "project")]
level: ConfigLevelArg,
},
LockStatus,
LockAudit {
#[arg(short, long, default_value = "20")]
limit: usize,
},
Export {
#[arg(long, default_value = "user")]
level: ConfigLevelArg,
#[arg(short, long)]
output: Option<std::path::PathBuf>,
#[arg(long)]
description: Option<String>,
},
Import {
file: std::path::PathBuf,
#[arg(long, default_value = "project")]
level: ConfigLevelArg,
#[arg(long)]
no_locks: bool,
#[arg(long)]
force: bool,
},
}
#[derive(clap::ValueEnum, Clone, Debug)]
pub enum ConfigLevelArg {
System,
User,
Project,
}
impl ConfigLevelArg {
pub fn to_config_level(&self) -> crate::config::ConfigLevel {
match self {
Self::System => crate::config::ConfigLevel::System,
Self::User => crate::config::ConfigLevel::User,
Self::Project => crate::config::ConfigLevel::Project,
}
}
}
pub mod config;
pub mod edition;
pub mod fix;
pub mod init;
pub mod rollback;
pub mod rust;
pub mod safety;
pub mod status;
pub mod template;
pub mod uninstall;
pub mod update;
pub mod validate;