forked from toolshed/abra
refactor: urfave v3
This commit is contained in:
cli
app
app.gobackup.gocheck.gocmd.goconfig.gocp.godeploy.golist.gologs.gonew.gops.goremove.gorestart.gorestore.gorollback.gorun.gosecret.goservices.goundeploy.goupgrade.govolume.go
catalogue
cli.gointernal
recipe
server
updater
pkg/autocomplete
scripts/autocomplete
vendor
github.com
Azure
go-ansiterm
ProtonMail
go-crypto
openpgp
beorn7
perks
quantile
cenkalti
backoff
containers
image
docker
reference
pkg
types
cpuguy83
go-md2man
v2
davecgh
go-spew
docker
emirpasic
gods
felixge
ghodss
go-git
gcfg
go-billy
go-git
v5
plumbing
format
config
gitignore
idxfile
index
packfile
object
protocol
packp
utils
worktree_bsd.goworktree_js.goworktree_linux.goworktree_unix_other.goworktree_windows.gogogo
protobuf
google
go-cmp
shlex
uuid
hashicorp
go-cleanhttp
kballard
go-shellquote
kevinburke
ssh_config
lucasb-eyer
go-colorful
mattn
go-isatty
mgutz
ansi
miekg
pkcs11
opencontainers
pkg
pmezard
go-difflib
difflib
russross
blackfriday
sergi
sirupsen
logrus
spf13
theupdateframework
notary
urfave
cli
.flake8.gitignoreCODE_OF_CONDUCT.mdLICENSEREADME.mdapp.gocategory.gocli.gocommand.gocontext.godocs.goerrors.gofish.goflag.goflag_bool.goflag_bool_t.goflag_duration.goflag_float64.goflag_generic.goflag_int.goflag_int64.goflag_int64_slice.goflag_int_slice.goflag_string.goflag_string_slice.goflag_uint.goflag_uint64.gofuncs.gohelp.goparse.gotemplate.go
v2
.flake8README.mdapp.goargs.gocli.gocommand.gocontext.godocs.goflag-spec.yamlflag_bool.goflag_duration.goflag_float64.goflag_float64_slice.goflag_generic.goflag_int.goflag_int64.goflag_int64_slice.goflag_int_slice.goflag_path.goflag_string.goflag_string_slice.goflag_timestamp.goflag_uint.goflag_uint64.goflag_uint64_slice.goflag_uint_slice.gogodoc-current.txthelp.gomkdocs-reqs.txtsliceflag.gosort.gosuggestions.gozz_generated.flags.go
v3
.gitignore.golangci.yamlCODE_OF_CONDUCT.mdLICENSEMakefileREADME.mdargs.go
autocomplete
category.gocli.gocommand.gocompletion.goerrors.gofish.goflag.goflag_bool.goflag_bool_with_inverse.goflag_duration.goflag_ext.goflag_float.goflag_float_slice.goflag_impl.goflag_int.goflag_int_slice.goflag_map_impl.goflag_mutex.goflag_slice_base.goflag_string.goflag_string_map.goflag_string_slice.goflag_timestamp.goflag_uint.goflag_uint_slice.gofuncs.gogodoc-current.txthelp.gomkdocs-reqs.txtmkdocs.ymlparse.gosort.gostaticcheck.confsuggestions.gotemplate.govalue_source.goxeipuuv
gojsonschema
xrash
go.opentelemetry.io
proto
otlp
golang.org
x
google.golang.org
protobuf
internal
impl
gopkg.in
warnings.v0
yaml.v2
yaml.v3
gotest.tools
v3
internal
difflib
183
vendor/github.com/urfave/cli/v3/fish.go
generated
vendored
Normal file
183
vendor/github.com/urfave/cli/v3/fish.go
generated
vendored
Normal file
@ -0,0 +1,183 @@
|
||||
package cli
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
// ToFishCompletion creates a fish completion string for the `*App`
|
||||
// The function errors if either parsing or writing of the string fails.
|
||||
func (cmd *Command) ToFishCompletion() (string, error) {
|
||||
var w bytes.Buffer
|
||||
if err := cmd.writeFishCompletionTemplate(&w); err != nil {
|
||||
return "", err
|
||||
}
|
||||
return w.String(), nil
|
||||
}
|
||||
|
||||
type fishCommandCompletionTemplate struct {
|
||||
Command *Command
|
||||
Completions []string
|
||||
AllCommands []string
|
||||
}
|
||||
|
||||
func (cmd *Command) writeFishCompletionTemplate(w io.Writer) error {
|
||||
const name = "cli"
|
||||
t, err := template.New(name).Parse(FishCompletionTemplate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
allCommands := []string{}
|
||||
|
||||
// Add global flags
|
||||
completions := cmd.prepareFishFlags(cmd.VisibleFlags(), allCommands)
|
||||
|
||||
// Add help flag
|
||||
if !cmd.HideHelp {
|
||||
completions = append(
|
||||
completions,
|
||||
cmd.prepareFishFlags([]Flag{HelpFlag}, allCommands)...,
|
||||
)
|
||||
}
|
||||
|
||||
// Add version flag
|
||||
if !cmd.HideVersion {
|
||||
completions = append(
|
||||
completions,
|
||||
cmd.prepareFishFlags([]Flag{VersionFlag}, allCommands)...,
|
||||
)
|
||||
}
|
||||
|
||||
// Add commands and their flags
|
||||
completions = append(
|
||||
completions,
|
||||
cmd.prepareFishCommands(cmd.VisibleCommands(), &allCommands, []string{})...,
|
||||
)
|
||||
|
||||
return t.ExecuteTemplate(w, name, &fishCommandCompletionTemplate{
|
||||
Command: cmd,
|
||||
Completions: completions,
|
||||
AllCommands: allCommands,
|
||||
})
|
||||
}
|
||||
|
||||
func (cmd *Command) prepareFishCommands(commands []*Command, allCommands *[]string, previousCommands []string) []string {
|
||||
completions := []string{}
|
||||
for _, command := range commands {
|
||||
if command.Hidden {
|
||||
continue
|
||||
}
|
||||
|
||||
var completion strings.Builder
|
||||
completion.WriteString(fmt.Sprintf(
|
||||
"complete -r -c %s -n '%s' -a '%s'",
|
||||
cmd.Name,
|
||||
cmd.fishSubcommandHelper(previousCommands),
|
||||
strings.Join(command.Names(), " "),
|
||||
))
|
||||
|
||||
if command.Usage != "" {
|
||||
completion.WriteString(fmt.Sprintf(" -d '%s'",
|
||||
escapeSingleQuotes(command.Usage)))
|
||||
}
|
||||
|
||||
if !command.HideHelp {
|
||||
completions = append(
|
||||
completions,
|
||||
cmd.prepareFishFlags([]Flag{HelpFlag}, command.Names())...,
|
||||
)
|
||||
}
|
||||
|
||||
*allCommands = append(*allCommands, command.Names()...)
|
||||
completions = append(completions, completion.String())
|
||||
completions = append(
|
||||
completions,
|
||||
cmd.prepareFishFlags(command.VisibleFlags(), command.Names())...,
|
||||
)
|
||||
|
||||
// recursively iterate subcommands
|
||||
if len(command.Commands) > 0 {
|
||||
completions = append(
|
||||
completions,
|
||||
cmd.prepareFishCommands(
|
||||
command.Commands, allCommands, command.Names(),
|
||||
)...,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
return completions
|
||||
}
|
||||
|
||||
func (cmd *Command) prepareFishFlags(flags []Flag, previousCommands []string) []string {
|
||||
completions := []string{}
|
||||
for _, f := range flags {
|
||||
completion := &strings.Builder{}
|
||||
completion.WriteString(fmt.Sprintf(
|
||||
"complete -c %s -n '%s'",
|
||||
cmd.Name,
|
||||
cmd.fishSubcommandHelper(previousCommands),
|
||||
))
|
||||
|
||||
fishAddFileFlag(f, completion)
|
||||
|
||||
for idx, opt := range f.Names() {
|
||||
if idx == 0 {
|
||||
completion.WriteString(fmt.Sprintf(
|
||||
" -l %s", strings.TrimSpace(opt),
|
||||
))
|
||||
} else {
|
||||
completion.WriteString(fmt.Sprintf(
|
||||
" -s %s", strings.TrimSpace(opt),
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
if flag, ok := f.(DocGenerationFlag); ok {
|
||||
if flag.TakesValue() {
|
||||
completion.WriteString(" -r")
|
||||
}
|
||||
|
||||
if flag.GetUsage() != "" {
|
||||
completion.WriteString(fmt.Sprintf(" -d '%s'",
|
||||
escapeSingleQuotes(flag.GetUsage())))
|
||||
}
|
||||
}
|
||||
|
||||
completions = append(completions, completion.String())
|
||||
}
|
||||
|
||||
return completions
|
||||
}
|
||||
|
||||
func fishAddFileFlag(flag Flag, completion *strings.Builder) {
|
||||
switch f := flag.(type) {
|
||||
case *StringFlag:
|
||||
if f.TakesFile {
|
||||
return
|
||||
}
|
||||
case *StringSliceFlag:
|
||||
if f.TakesFile {
|
||||
return
|
||||
}
|
||||
}
|
||||
completion.WriteString(" -f")
|
||||
}
|
||||
|
||||
func (cmd *Command) fishSubcommandHelper(allCommands []string) string {
|
||||
fishHelper := fmt.Sprintf("__fish_%s_no_subcommand", cmd.Name)
|
||||
if len(allCommands) > 0 {
|
||||
fishHelper = fmt.Sprintf(
|
||||
"__fish_seen_subcommand_from %s",
|
||||
strings.Join(allCommands, " "),
|
||||
)
|
||||
}
|
||||
return fishHelper
|
||||
}
|
||||
|
||||
func escapeSingleQuotes(input string) string {
|
||||
return strings.Replace(input, `'`, `\'`, -1)
|
||||
}
|
Reference in New Issue
Block a user