From 23fd711be278c59e7762f1e1ba5c10380ffc1e1d Mon Sep 17 00:00:00 2001 From: Arsen Musayelyan Date: Fri, 2 Dec 2022 12:29:55 -0800 Subject: [PATCH] Add bash and zsh completions --- main.go | 37 +++++++++++++++++++++++++++++++++---- scripts/completion/bash | 21 +++++++++++++++++++++ scripts/completion/zsh | 20 ++++++++++++++++++++ 3 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 scripts/completion/bash create mode 100644 scripts/completion/zsh diff --git a/main.go b/main.go index f59932c..d676c5a 100644 --- a/main.go +++ b/main.go @@ -20,15 +20,19 @@ package main import ( "context" + "fmt" "os" "os/signal" "syscall" "time" + "github.com/genjidb/genji/document" + "github.com/genjidb/genji/types" "github.com/urfave/cli/v2" "go.arsenm.dev/logger" "go.arsenm.dev/logger/log" "go.arsenm.dev/lure/internal/config" + "go.arsenm.dev/lure/internal/db" ) //go:generate scripts/gen-version.sh @@ -54,10 +58,11 @@ func main() { Usage: "Linux User REpository", Commands: []*cli.Command{ { - Name: "install", - Usage: "Install a new package", - Aliases: []string{"in"}, - Action: installCmd, + Name: "install", + Usage: "Install a new package", + Aliases: []string{"in"}, + Action: installCmd, + BashComplete: completionInstall, }, { Name: "remove", @@ -150,6 +155,7 @@ func main() { After: func(ctx *cli.Context) error { return gdb.Close() }, + EnableBashCompletion: true, } err := app.RunContext(ctx, os.Args) @@ -162,3 +168,26 @@ func displayVersion(c *cli.Context) error { print(config.Version) return nil } + +func completionInstall(c *cli.Context) { + result, err := db.GetPkgs(gdb, "true") + if err != nil { + log.Fatal("Error getting packages").Err(err).Send() + } + defer result.Close() + + err = result.Iterate(func(d types.Document) error { + var pkg db.Package + err = document.StructScan(d, &pkg) + if err != nil { + return err + } + + fmt.Println(pkg.Name) + + return nil + }) + if err != nil { + log.Fatal("Error iterating over packages").Err(err).Send() + } +} diff --git a/scripts/completion/bash b/scripts/completion/bash new file mode 100644 index 0000000..ac5df1f --- /dev/null +++ b/scripts/completion/bash @@ -0,0 +1,21 @@ +#! /bin/bash + +: ${PROG:=$(basename ${BASH_SOURCE})} + +_cli_bash_autocomplete() { + if [[ "${COMP_WORDS[0]}" != "source" ]]; then + local cur opts base + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + if [[ "$cur" == "-"* ]]; then + opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion ) + else + opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion ) + fi + COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) + return 0 + fi +} + +complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete $PROG +unset PROG \ No newline at end of file diff --git a/scripts/completion/zsh b/scripts/completion/zsh new file mode 100644 index 0000000..3f2b2a4 --- /dev/null +++ b/scripts/completion/zsh @@ -0,0 +1,20 @@ +#compdef lure + +_cli_zsh_autocomplete() { + local -a opts + local cur + cur=${words[-1]} + if [[ "$cur" == "-"* ]]; then + opts=("${(@f)$(${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}") + else + opts=("${(@f)$(${words[@]:0:#words[@]-1} --generate-bash-completion)}") + fi + + if [[ "${opts[1]}" != "" ]]; then + _describe 'values' opts + else + _files + fi +} + +compdef _cli_zsh_autocomplete lure