Última actividad 1 month ago

Subcomando completions con generacion de autocompletado (capitulo 07)

completions.rs Sin formato
1use anyhow::Result;
2use clap::CommandFactory;
3use clap_complete::{generate_to, Shell};
4use std::path::PathBuf;
5
6use crate::cli::Cli;
7
8pub fn ejecutar(shell: &str) -> Result<()> {
9 let shell = match shell {
10 "bash" => Shell::Bash,
11 "zsh" => Shell::Zsh,
12 "fish" => Shell::Fish,
13 _ => anyhow::bail!("Shell no soportada: {}", shell),
14 };
15
16 let mut cmd = Cli::command();
17 let bin_name = "crustaceo-tools";
18
19 let out_dir = PathBuf::from(".");
20
21 let archivo = match shell {
22 Shell::Bash => "crustaceo-tools.bash",
23 Shell::Zsh => "_crustaceo-tools",
24 Shell::Fish => "crustaceo-tools.fish",
25 _ => unreachable!(),
26 };
27
28 let path = generate_to(shell, &mut cmd, bin_name, &out_dir)?;
29 println!("Autocompletado generado: {}", path.display());
30 println!();
31 println!("Instalalo segun tu shell:");
32 println!();
33 match shell {
34 Shell::Bash => {
35 println!(" source {}", archivo);
36 println!(" # O anadelo a ~/.bashrc:");
37 println!(" echo 'source $(pwd)/{}' >> ~/.bashrc", archivo);
38 }
39 Shell::Zsh => {
40 println!(" # Copia a un directorio en tu fpath:");
41 println!(" cp {} ~/.zsh/completions/", archivo);
42 println!(" # O directamente:");
43 println!(" source {}", archivo);
44 }
45 Shell::Fish => {
46 println!(" mkdir -p ~/.config/fish/completions/");
47 println!(" cp {} ~/.config/fish/completions/", archivo);
48 }
49 _ => unreachable!(),
50 }
51
52 Ok(())
53}