envvault/cli/commands/
completions.rs1use std::io;
10
11use clap::CommandFactory;
12use clap_complete::{generate, Shell};
13
14use crate::cli::Cli;
15use crate::errors::{EnvVaultError, Result};
16
17pub fn execute(shell: &str) -> Result<()> {
19 let shell = parse_shell(shell)?;
20 let mut cmd = Cli::command();
21 generate(shell, &mut cmd, "envvault", &mut io::stdout());
22 Ok(())
23}
24
25fn parse_shell(name: &str) -> Result<Shell> {
27 match name.to_lowercase().as_str() {
28 "bash" => Ok(Shell::Bash),
29 "zsh" => Ok(Shell::Zsh),
30 "fish" => Ok(Shell::Fish),
31 "powershell" | "ps" => Ok(Shell::PowerShell),
32 "elvish" => Ok(Shell::Elvish),
33 other => Err(EnvVaultError::CommandFailed(format!(
34 "unknown shell '{other}' — supported: bash, zsh, fish, powershell, elvish"
35 ))),
36 }
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn parse_shell_bash() {
45 assert_eq!(parse_shell("bash").unwrap(), Shell::Bash);
46 }
47
48 #[test]
49 fn parse_shell_zsh() {
50 assert_eq!(parse_shell("zsh").unwrap(), Shell::Zsh);
51 }
52
53 #[test]
54 fn parse_shell_fish() {
55 assert_eq!(parse_shell("fish").unwrap(), Shell::Fish);
56 }
57
58 #[test]
59 fn parse_shell_powershell() {
60 assert_eq!(parse_shell("powershell").unwrap(), Shell::PowerShell);
61 assert_eq!(parse_shell("ps").unwrap(), Shell::PowerShell);
62 }
63
64 #[test]
65 fn parse_shell_case_insensitive() {
66 assert_eq!(parse_shell("BASH").unwrap(), Shell::Bash);
67 assert_eq!(parse_shell("Zsh").unwrap(), Shell::Zsh);
68 }
69
70 #[test]
71 fn parse_shell_unknown_fails() {
72 assert!(parse_shell("csh").is_err());
73 assert!(parse_shell("").is_err());
74 }
75}