1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use std::io;

use clap::Command;
use clap_complete::{generate, shells, Generator};
use strum::EnumString;

#[derive(EnumString, Debug, Clone, Copy)]
#[strum(ascii_case_insensitive)]
pub enum ShellType {
    Bash,
    Fish,
    Zsh,
    PowerShell,
    Elvish,
}

impl ShellType {
    pub fn generate_completion(&self, name: &str, cmd: &mut Command) {
        match self {
            ShellType::Bash => gen(shells::Bash, name, cmd),
            ShellType::Fish => gen(shells::Fish, name, cmd),
            ShellType::Zsh => gen(shells::Zsh, name, cmd),
            ShellType::PowerShell => gen(shells::PowerShell, name, cmd),
            ShellType::Elvish => gen(shells::Elvish, name, cmd),
        }
    }
}

fn gen<G: Generator>(shell: G, name: &str, cmd: &mut Command) {
    generate(shell, cmd, name, &mut io::stdout());
}