mirror of
https://github.com/spf13/cobra
synced 2024-12-29 15:57:10 +00:00
Format with spaces instead of tabs
This commit is contained in:
parent
e7abbf39a3
commit
7eac0e11ae
1 changed files with 85 additions and 87 deletions
|
@ -15,114 +15,112 @@
|
||||||
package cobra
|
package cobra
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Command) GenNushellCompletion(w io.Writer, includeDesc bool) error {
|
func (c *Command) GenNushellCompletion(w io.Writer, includeDesc bool) error {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
WriteStringAndCheck(buf, fmt.Sprintf(`
|
WriteStringAndCheck(buf, fmt.Sprintf(`
|
||||||
# An external completer that works with any cobra based
|
|
||||||
# command line application (e.g. kubectl, minikube)
|
|
||||||
let cobra_completer = {|spans|
|
let cobra_completer = {|spans|
|
||||||
let ShellCompDirectiveError = %[1]d
|
let ShellCompDirectiveError = %[1]d
|
||||||
let ShellCompDirectiveNoSpace = %[2]d
|
let ShellCompDirectiveNoSpace = %[2]d
|
||||||
let ShellCompDirectiveNoFileComp = %[3]d
|
let ShellCompDirectiveNoFileComp = %[3]d
|
||||||
let ShellCompDirectiveFilterFileExt = %[4]d
|
let ShellCompDirectiveFilterFileExt = %[4]d
|
||||||
let ShellCompDirectiveFilterDirs = %[5]d
|
let ShellCompDirectiveFilterDirs = %[5]d
|
||||||
|
|
||||||
let cmd = $spans | first
|
let cmd = $spans | first
|
||||||
let rest = $spans | skip
|
let rest = $spans | skip
|
||||||
|
|
||||||
def exec_complete [
|
def exec_complete [
|
||||||
spans: list<string>
|
spans: list<string>
|
||||||
] {
|
] {
|
||||||
# This will catch the stderr message related to the directive and any other errors,
|
# This will catch the stderr message related to the directive and any other errors,
|
||||||
# such as the command not being a cobra based command
|
# such as the command not being a cobra based command
|
||||||
let result = do --ignore-errors { cobra_active_help=0 run-external $cmd "__complete" ...$spans | complete }
|
let result = do --ignore-errors { cobra_active_help=0 run-external $cmd "__complete" ...$spans | complete }
|
||||||
|
|
||||||
if $result != null and $result.exit_code == 0 {
|
if $result != null and $result.exit_code == 0 {
|
||||||
let completions = $result.stdout | lines
|
let completions = $result.stdout | lines
|
||||||
|
|
||||||
# the directive is the last line
|
# the directive is the last line
|
||||||
let directive = do -i { $completions | last | str replace ':' '' | into int }
|
let directive = do -i { $completions | last | str replace ':' '' | into int }
|
||||||
|
|
||||||
let completions = $completions | drop | each { |it|
|
let completions = $completions | drop | each { |it|
|
||||||
# the first word is the command, the rest is the description
|
# the first word is the command, the rest is the description
|
||||||
let words = $it | split row -r '\s{1}'
|
let words = $it | split row -r '\s{1}'
|
||||||
|
|
||||||
# If the last span contains a hypen and equals, attach it to the name
|
# If the last span contains a hypen and equals, attach it to the name
|
||||||
let last_span = $spans | last
|
let last_span = $spans | last
|
||||||
let words = if ($last_span =~ '^-') and ($last_span =~ '=$') {
|
let words = if ($last_span =~ '^-') and ($last_span =~ '=$') {
|
||||||
$words | each {|it| $"($last_span)($it)" }
|
$words | each {|it| $"($last_span)($it)" }
|
||||||
} else {
|
} else {
|
||||||
$words
|
$words
|
||||||
}
|
}
|
||||||
|
|
||||||
{value: ($words | first | str trim), description: ($words | skip | str join ' ')}
|
{value: ($words | first | str trim), description: ($words | skip | str join ' ')}
|
||||||
}
|
}
|
||||||
|
|
||||||
{completions: $completions, directive: $directive}
|
{completions: $completions, directive: $directive}
|
||||||
} else {
|
} else {
|
||||||
{completions: [], directive: -1}
|
{completions: [], directive: -1}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (not ($rest | is-empty)) {
|
if (not ($rest | is-empty)) {
|
||||||
let result = exec_complete $rest
|
let result = exec_complete $rest
|
||||||
let completions = $result.completions
|
let completions = $result.completions
|
||||||
let directive = $result.directive
|
let directive = $result.directive
|
||||||
|
|
||||||
# Add space at the end of each completion
|
# Add space at the end of each completion
|
||||||
let completions = if $directive != $ShellCompDirectiveNoSpace {
|
let completions = if $directive != $ShellCompDirectiveNoSpace {
|
||||||
$completions | each {|it| {value: $"($it.value) ", description: $it.description}}
|
$completions | each {|it| {value: $"($it.value) ", description: $it.description}}
|
||||||
} else {
|
} else {
|
||||||
$completions
|
$completions
|
||||||
}
|
}
|
||||||
|
|
||||||
# Cobra returns a list of completions that are supported with this directive
|
# Cobra returns a list of completions that are supported with this directive
|
||||||
# There is no way to currently support this in a nushell external completer
|
# There is no way to currently support this in a nushell external completer
|
||||||
let completions = if $directive == $ShellCompDirectiveFilterFileExt {
|
let completions = if $directive == $ShellCompDirectiveFilterFileExt {
|
||||||
[]
|
[]
|
||||||
} else {
|
} else {
|
||||||
$completions
|
$completions
|
||||||
}
|
}
|
||||||
|
|
||||||
if $directive == $ShellCompDirectiveNoFileComp {
|
if $directive == $ShellCompDirectiveNoFileComp {
|
||||||
# Allow empty results as this will stop file completion
|
# Allow empty results as this will stop file completion
|
||||||
$completions
|
$completions
|
||||||
} else if ($completions | is-empty) or $directive == $ShellCompDirectiveError {
|
} else if ($completions | is-empty) or $directive == $ShellCompDirectiveError {
|
||||||
# Not returning null causes file completions to break
|
# Not returning null causes file completions to break
|
||||||
# Return null if there are no completions or ShellCompDirectiveError
|
# Return null if there are no completions or ShellCompDirectiveError
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
$completions
|
$completions
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($completions | is-empty) {
|
if ($completions | is-empty) {
|
||||||
null
|
null
|
||||||
} else {
|
} else {
|
||||||
$completions
|
$completions
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
null
|
null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
|
`, ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
|
||||||
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs))
|
ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs))
|
||||||
|
|
||||||
_, err := buf.WriteTo(w)
|
_, err := buf.WriteTo(w)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Command) GenNushellCompletionFile(filename string, includeDesc bool) error {
|
func (c *Command) GenNushellCompletionFile(filename string, includeDesc bool) error {
|
||||||
outFile, err := os.Create(filename)
|
outFile, err := os.Create(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer outFile.Close()
|
defer outFile.Close()
|
||||||
|
|
||||||
return c.GenNushellCompletion(outFile, includeDesc)
|
return c.GenNushellCompletion(outFile, includeDesc)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue