mirror of
https://github.com/gopasspw/gopass.git
synced 2026-05-30 11:18:48 +02:00
7281ca8ab4
* [chore] Migrate to golangci-lint v2 Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [chore] Fix more lint issues Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [chore] Fix more lint issue Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [chore] Fix more lint issues Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [chore] Add more package comments. Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [chore] Fix golangci-lint config and the remaining checks Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [fix] Use Go 1.24 Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [fix] Fix container builds Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * Fix more failing tests Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * Fix test failure Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * Fix another len assertion Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * Move location tests Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [fix] Fix most remaining lint issues Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [fix] Only run XDG specific tests on linux Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> * [fix] Attempt to address on source of flaky failures Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org> --------- Signed-off-by: Dominik Schulz <dominik.schulz@gauner.org>
79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
// Package zsh implements a zsh completion script generator.
|
|
package zsh
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
"text/template"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// ErrUnknownType is returned when an unknown type is encountered.
|
|
var ErrUnknownType = fmt.Errorf("unknown type")
|
|
|
|
func longName(name string) string {
|
|
// "If s does not contain sep and sep is not empty, Split returns a slice of length 1 whose only element is s."
|
|
// from https://golang.org/pkg/strings/#Split
|
|
return strings.TrimSpace(strings.Split(name, ",")[0])
|
|
}
|
|
|
|
func formatFlag(name, usage string) string {
|
|
// Suare brackets must be escaped in zsh completions
|
|
usage = strings.ReplaceAll(usage, "[", "\\[")
|
|
usage = strings.ReplaceAll(usage, "]", "\\]")
|
|
|
|
return fmt.Sprintf("--%s[%s]", longName(name), usage)
|
|
}
|
|
|
|
func formatFlagFunc() func(cli.Flag) (string, error) {
|
|
return func(f cli.Flag) (string, error) {
|
|
switch ft := f.(type) {
|
|
case *cli.BoolFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.Float64Flag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.GenericFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.Int64Flag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.Int64SliceFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.IntFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.IntSliceFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.StringFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.StringSliceFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.Uint64Flag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
case *cli.UintFlag:
|
|
return formatFlag(ft.Name, ft.Usage), nil
|
|
default:
|
|
return "", fmt.Errorf("error '%T': %w", f, ErrUnknownType)
|
|
}
|
|
}
|
|
}
|
|
|
|
// GetCompletion returns a zsh completion script.
|
|
func GetCompletion(a *cli.App) (string, error) {
|
|
tplFuncs := template.FuncMap{
|
|
"formatFlag": formatFlagFunc(),
|
|
}
|
|
|
|
tpl, err := template.New("zsh").Funcs(tplFuncs).Parse(zshTemplate)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
buf := &bytes.Buffer{}
|
|
if err := tpl.Execute(buf, a); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return buf.String(), nil
|
|
}
|