use std::collections::HashMap;
pub fn generate_bash_completion(aliases: &HashMap<String, Vec<String>>) {
println!("_git_short() {{");
println!(" local cur prev");
println!(" COMPREPLY=()");
println!(" cur=\"${{COMP_WORDS[COMP_CWORD]}}\"");
println!(" prev=\"${{COMP_WORDS[COMP_CWORD-1]}}\"");
println!();
println!(" case \"${{prev}}\" in");
println!(" g|git-alias)");
println!(
" COMPREPLY=($(compgen -W \"{}\" -- \"${{cur}}\"))",
aliases.keys().cloned().collect::<Vec<_>>().join(" ")
);
println!(" return 0");
println!(" ;;");
println!(" esac");
println!("}}");
println!("complete -F _git_short g git-alias");
}
pub fn generate_zsh_completion(aliases: &HashMap<String, Vec<String>>) {
println!("#compdef g git-alias");
println!();
println!("_git_short() {{");
println!(" local -a commands");
println!(" commands=(");
let mut sorted: Vec<_> = aliases.iter().collect();
sorted.sort_by_key(|(k, _)| k.to_string());
for (alias, command) in sorted {
let desc = command.join(" ");
println!(" '{}[git {}]'", alias, desc);
}
println!(" )");
println!(" _describe 'command' commands");
println!("}}");
println!();
println!("if [[ $1 == 'g' ]] || [[ $1 == 'git-alias' ]]; then");
println!(" _git_short");
println!("fi");
}
pub fn generate_fish_completion(aliases: &HashMap<String, Vec<String>>) {
println!("complete -c g -f");
println!("complete -c git-alias -f");
println!();
let mut sorted: Vec<_> = aliases.iter().collect();
sorted.sort_by_key(|(k, _)| k.to_string());
for (alias, command) in sorted {
let desc = command.join(" ");
println!("complete -c g -a '{}' -d 'git {}'", alias, desc);
println!("complete -c git-alias -a '{}' -d 'git {}'", alias, desc);
}
}
pub fn print_completions(shell: &str, aliases: &HashMap<String, Vec<String>>) {
match shell {
"bash" => generate_bash_completion(aliases),
"zsh" => generate_zsh_completion(aliases),
"fish" => generate_fish_completion(aliases),
_ => {
eprintln!("Unsupported shell: {}", shell);
eprintln!("Supported shells: bash, zsh, fish");
},
}
}