diff --git a/src/cortex-cli/src/cli/args.rs b/src/cortex-cli/src/cli/args.rs index 641d63a4..f6b27fd9 100644 --- a/src/cortex-cli/src/cli/args.rs +++ b/src/cortex-cli/src/cli/args.rs @@ -551,7 +551,7 @@ pub struct LogoutCommand { #[derive(Args)] pub struct CompletionCommand { /// Shell to generate completions for. - #[arg(value_enum)] + #[arg(value_parser = parse_completion_shell)] pub shell: Option, /// Install completions to your shell configuration file. @@ -559,6 +559,19 @@ pub struct CompletionCommand { pub install: bool, } +fn parse_completion_shell(value: &str) -> Result { + match value.to_ascii_lowercase().as_str() { + "bash" => Ok(clap_complete::Shell::Bash), + "elvish" => Ok(clap_complete::Shell::Elvish), + "fish" => Ok(clap_complete::Shell::Fish), + "powershell" | "pwsh" => Ok(clap_complete::Shell::PowerShell), + "zsh" => Ok(clap_complete::Shell::Zsh), + _ => Err(format!( + "invalid shell '{value}'. Expected one of: bash, elvish, fish, powershell, pwsh, zsh" + )), + } +} + /// Init command - initialize AGENTS.md. #[derive(Args)] pub struct InitCommand { @@ -1754,6 +1767,28 @@ mod tests { } } + #[test] + fn test_completion_command_powershell() { + let cli = Cli::try_parse_from(["cortex", "completion", "powershell"]) + .expect("should parse completion powershell"); + if let Some(Commands::Completion(completion)) = cli.command { + assert_eq!(completion.shell, Some(clap_complete::Shell::PowerShell)); + } else { + panic!("Expected Completion command"); + } + } + + #[test] + fn test_completion_command_pwsh_alias() { + let cli = Cli::try_parse_from(["cortex", "completion", "pwsh"]) + .expect("should parse completion pwsh"); + if let Some(Commands::Completion(completion)) = cli.command { + assert_eq!(completion.shell, Some(clap_complete::Shell::PowerShell)); + } else { + panic!("Expected Completion command"); + } + } + #[test] fn test_completion_command_install() { let cli = Cli::try_parse_from(["cortex", "completion", "--install"])