git-alias 1.2.12

A fast git alias tool with dual-style command support
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");
        }
    }
}