Skip to main content

envvault/cli/commands/
completions.rs

1//! `envvault completions` — generate shell completion scripts.
2//!
3//! Usage:
4//!   envvault completions bash > ~/.bash_completion.d/envvault
5//!   envvault completions zsh
6//!   envvault completions fish
7//!   envvault completions powershell
8
9use std::io;
10
11use clap::CommandFactory;
12use clap_complete::{generate, Shell};
13
14use crate::cli::Cli;
15use crate::errors::{EnvVaultError, Result};
16
17/// Execute the `completions` command.
18pub 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
25/// Parse a shell name string into a `Shell` enum.
26fn 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}