use clap::{Args, CommandFactory, ValueEnum};
use clap_complete::{generate, Shell};
use crate::cli::Cli;
use crate::util::CliError;
#[derive(Debug, Args)]
pub struct CompletionArgs {
#[arg(value_enum)]
pub shell: CompletionShell,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum CompletionShell {
Bash,
Zsh,
Fish,
Powershell,
}
impl From<CompletionShell> for Shell {
fn from(value: CompletionShell) -> Self {
match value {
CompletionShell::Bash => Shell::Bash,
CompletionShell::Zsh => Shell::Zsh,
CompletionShell::Fish => Shell::Fish,
CompletionShell::Powershell => Shell::PowerShell,
}
}
}
pub fn run(args: CompletionArgs) -> Result<(), CliError> {
let mut cmd = Cli::command();
let bin_name = cmd.get_name().to_string();
generate(
Shell::from(args.shell),
&mut cmd,
bin_name,
&mut std::io::stdout(),
);
Ok(())
}