leetcode_cli/cmd/
completions.rs

1//! Completions command
2use crate::err::Error;
3use clap::{Args, Command as ClapCommand};
4use clap_complete::{Generator, Shell, generate};
5
6/// Completions command arguments
7#[derive(Args)]
8pub struct CompletionsArgs {
9    /// Shell type [possible values: bash, elvish, fish, powershell, zsh]
10    #[arg(value_parser = clap::value_parser!(Shell))]
11    pub shell: Option<Shell>,
12}
13
14fn get_completions_string<G: Generator>(
15    generator: G,
16    cmd: &mut ClapCommand,
17) -> Result<String, Error> {
18    let mut v: Vec<u8> = Vec::new();
19    let name = cmd.get_name().to_string();
20    generate(generator, cmd, name, &mut v);
21    Ok(String::from_utf8(v)?)
22}
23
24impl CompletionsArgs {
25    /// Generate and print shell completions
26    pub fn run(&self, cmd: &mut ClapCommand) -> Result<(), Error> {
27        let shell = self
28            .shell
29            .or_else(Shell::from_env)
30            .ok_or(Error::MatchError)?;
31        let completions = get_completions_string(shell, cmd)?;
32        println!("{}", completions);
33        Ok(())
34    }
35}