Format with spaces instead of tabs

This commit is contained in:
Jack Wright 2024-11-30 13:32:05 -08:00
parent e7abbf39a3
commit 7eac0e11ae
1 changed files with 85 additions and 87 deletions

View File

@ -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)
} }