use clap::{CommandFactory, Parser, Subcommand, ValueEnum};
use clap_complete::{generate, Shell};
use clap_complete_nushell::Nushell;
#[derive(Parser)]
#[command(name = "pkg-checker")]
#[command(about = "检查全局安装的Cargo包更新")]
#[command(version)]
pub struct Cli {
#[arg(short, long)]
pub verbose: bool,
#[arg(short, long)]
pub updates_only: bool,
#[arg(long)]
pub no_interactive: bool,
#[arg(long)]
pub include_prerelease: bool,
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Subcommand)]
pub enum Commands {
Completion {
#[arg(value_enum)]
shell: ShellType,
},
}
#[derive(Clone, ValueEnum)]
pub enum ShellType {
Bash,
Zsh,
Fish,
Powershell,
Elvish,
Nushell,
}
impl Cli {
pub fn generate_completion(shell: ShellType) {
let mut cmd = Cli::command();
match shell {
ShellType::Bash => {
generate(Shell::Bash, &mut cmd, "pkg-checker", &mut std::io::stdout());
}
ShellType::Zsh => {
generate(Shell::Zsh, &mut cmd, "pkg-checker", &mut std::io::stdout());
}
ShellType::Fish => {
generate(Shell::Fish, &mut cmd, "pkg-checker", &mut std::io::stdout());
}
ShellType::Powershell => {
generate(Shell::PowerShell, &mut cmd, "pkg-checker", &mut std::io::stdout());
}
ShellType::Elvish => {
generate(Shell::Elvish, &mut cmd, "pkg-checker", &mut std::io::stdout());
}
ShellType::Nushell => {
generate(Nushell, &mut cmd, "pkg-checker", &mut std::io::stdout());
}
}
}
}