mirror of
https://github.com/spf13/cobra
synced 2025-05-05 21:07:24 +00:00
Issue #107: use fmt.Fprintf instead of wrapping the writer
This commit is contained in:
parent
52d469c091
commit
dcf38a7f94
1 changed files with 29 additions and 38 deletions
|
@ -7,31 +7,21 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type fWriter struct {
|
|
||||||
io.Writer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (fw *fWriter) fWriteLn(format string, a ...interface{}) (int, error) {
|
|
||||||
return io.WriteString(fw, fmt.Sprintf(format+"\n", a...))
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenZshCompletion generates a zsh completion file and writes to the passed writer.
|
// GenZshCompletion generates a zsh completion file and writes to the passed writer.
|
||||||
func (cmd *Command) GenZshCompletion(w io.Writer) error {
|
func (cmd *Command) GenZshCompletion(w io.Writer) error {
|
||||||
buf := new(bytes.Buffer)
|
buf := new(bytes.Buffer)
|
||||||
fw := &fWriter{buf}
|
|
||||||
|
|
||||||
writeHeader(fw, cmd)
|
writeHeader(buf, cmd)
|
||||||
maxDepth := maxDepth(cmd)
|
maxDepth := maxDepth(cmd)
|
||||||
writeLevelMapping(fw, maxDepth)
|
writeLevelMapping(buf, maxDepth)
|
||||||
writeLevelCases(fw, maxDepth, cmd)
|
writeLevelCases(buf, maxDepth, cmd)
|
||||||
|
|
||||||
_, err := buf.WriteTo(w)
|
_, err := buf.WriteTo(w)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeHeader(fw *fWriter, cmd *Command) {
|
func writeHeader(w io.Writer, cmd *Command) {
|
||||||
fw.fWriteLn("#compdef %s", cmd.Name())
|
fmt.Fprintf(w, "#compdef %s\n\n", cmd.Name())
|
||||||
fw.fWriteLn("")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func maxDepth(c *Command) int {
|
func maxDepth(c *Command) int {
|
||||||
|
@ -48,45 +38,46 @@ func maxDepth(c *Command) int {
|
||||||
return 1 + maxDepthSub
|
return 1 + maxDepthSub
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeLevelMapping(fw *fWriter, numLevels int) {
|
func writeLevelMapping(w io.Writer, numLevels int) {
|
||||||
fw.fWriteLn(`_arguments \`)
|
fmt.Fprintln(w, `_arguments \`)
|
||||||
for i := 1; i <= numLevels; i++ {
|
for i := 1; i <= numLevels; i++ {
|
||||||
fw.fWriteLn(` '%d: :->level%d' \`, i, i)
|
fmt.Fprintf(w, ` '%d: :->level%d' \`, i, i)
|
||||||
|
fmt.Fprintln(w)
|
||||||
}
|
}
|
||||||
fw.fWriteLn(` '%d: :%s'`, numLevels+1, "_files")
|
fmt.Fprintf(w, ` '%d: :%s'`, numLevels+1, "_files")
|
||||||
fw.fWriteLn("")
|
fmt.Fprintln(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeLevelCases(fw *fWriter, maxDepth int, root *Command) {
|
func writeLevelCases(w io.Writer, maxDepth int, root *Command) {
|
||||||
fw.fWriteLn("case $state in")
|
fmt.Fprintln(w, "case $state in")
|
||||||
defer fw.fWriteLn("esac")
|
defer fmt.Fprintln(w, "esac")
|
||||||
|
|
||||||
for i := 1; i <= maxDepth; i++ {
|
for i := 1; i <= maxDepth; i++ {
|
||||||
fw.fWriteLn(" level%d)", i)
|
fmt.Fprintf(w, " level%d)\n", i)
|
||||||
writeLevel(fw, root, i)
|
writeLevel(w, root, i)
|
||||||
fw.fWriteLn(" ;;")
|
fmt.Fprintln(w, " ;;")
|
||||||
}
|
}
|
||||||
fw.fWriteLn(" *)")
|
fmt.Fprintln(w, " *)")
|
||||||
fw.fWriteLn(" _arguments '*: :_files'")
|
fmt.Fprintln(w, " _arguments '*: :_files'")
|
||||||
fw.fWriteLn(" ;;")
|
fmt.Fprintln(w, " ;;")
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeLevel(fw *fWriter, root *Command, i int) {
|
func writeLevel(w io.Writer, root *Command, i int) {
|
||||||
fw.fWriteLn(fmt.Sprintf(" case $words[%d] in", i))
|
fmt.Fprintf(w, " case $words[%d] in\n", i)
|
||||||
defer fw.fWriteLn(" esac")
|
defer fmt.Fprintln(w, " esac")
|
||||||
|
|
||||||
commands := filterByLevel(root, i)
|
commands := filterByLevel(root, i)
|
||||||
byParent := groupByParent(commands)
|
byParent := groupByParent(commands)
|
||||||
|
|
||||||
for p, c := range byParent {
|
for p, c := range byParent {
|
||||||
names := names(c)
|
names := names(c)
|
||||||
fw.fWriteLn(fmt.Sprintf(" %s)", p))
|
fmt.Fprintf(w, " %s)\n", p)
|
||||||
fw.fWriteLn(fmt.Sprintf(" _arguments '%d: :(%s)'", i, strings.Join(names, " ")))
|
fmt.Fprintf(w, " _arguments '%d: :(%s)'\n", i, strings.Join(names, " "))
|
||||||
fw.fWriteLn(fmt.Sprintf(" ;;"))
|
fmt.Fprintln(w, " ;;")
|
||||||
}
|
}
|
||||||
fw.fWriteLn(" *)")
|
fmt.Fprintln(w, " *)")
|
||||||
fw.fWriteLn(" _arguments '*: :_files'")
|
fmt.Fprintln(w, " _arguments '*: :_files'")
|
||||||
fw.fWriteLn(" ;;")
|
fmt.Fprintln(w, " ;;")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue