Add completions subcommands
This commit is contained in:
parent
c6e41de5c8
commit
3f7f04e4f1
|
@ -0,0 +1,124 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"go.fifitido.net/cmd/opt"
|
||||
)
|
||||
|
||||
var outputFileOption = opt.String("output", "o", "", "The file to output the completions to")
|
||||
|
||||
func CompletionsSubcommand() *Command {
|
||||
cmd := New(
|
||||
"completions",
|
||||
WithShortDescription("Generate shell completions"),
|
||||
WithLongDescription("Generate shell completions"),
|
||||
)
|
||||
|
||||
registerBashCompletions(cmd)
|
||||
registerFishCompletions(cmd)
|
||||
registerPowerShellCompletions(cmd)
|
||||
registerZsgCompletions(cmd)
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
func getCompletionsOut() io.Writer {
|
||||
outputFile := outputFileOption.Value()
|
||||
|
||||
if outputFile != "" {
|
||||
var err error
|
||||
out, err := os.OpenFile(outputFile, os.O_WRONLY|os.O_CREATE, 0644)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
return os.Stdout
|
||||
}
|
||||
|
||||
func registerBashCompletions(parent *Command) *Command {
|
||||
return New(
|
||||
"bash",
|
||||
WithShortDescription("Generate bash completions"),
|
||||
WithLongDescription("Generate bash completions"),
|
||||
WithOptions(outputFileOption),
|
||||
WithParent(parent),
|
||||
WithRunFunc(func(args []string) {
|
||||
out := getCompletionsOut()
|
||||
|
||||
if fc, ok := out.(io.Closer); ok {
|
||||
defer fc.Close()
|
||||
}
|
||||
|
||||
if err := WriteBashCompletions(out, parent.Root()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
func registerFishCompletions(parent *Command) *Command {
|
||||
return New(
|
||||
"fish",
|
||||
WithShortDescription("Generate fish completions"),
|
||||
WithLongDescription("Generate fish completions"),
|
||||
WithOptions(outputFileOption),
|
||||
WithParent(parent),
|
||||
WithRunFunc(func(args []string) {
|
||||
out := getCompletionsOut()
|
||||
|
||||
if fc, ok := out.(io.Closer); ok {
|
||||
defer fc.Close()
|
||||
}
|
||||
|
||||
if err := WriteFishCompletions(out, parent.Root()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
func registerPowerShellCompletions(parent *Command) *Command {
|
||||
return New(
|
||||
"powershell",
|
||||
WithShortDescription("Generate powershell completions"),
|
||||
WithLongDescription("Generate powershell completions"),
|
||||
WithOptions(outputFileOption),
|
||||
WithParent(parent),
|
||||
WithRunFunc(func(args []string) {
|
||||
out := getCompletionsOut()
|
||||
|
||||
if fc, ok := out.(io.Closer); ok {
|
||||
defer fc.Close()
|
||||
}
|
||||
|
||||
if err := WritePowerShellCompletions(out, parent.Root()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
func registerZsgCompletions(parent *Command) *Command {
|
||||
return New(
|
||||
"zsh",
|
||||
WithShortDescription("Generate zsh completions"),
|
||||
WithLongDescription("Generate zsh completions"),
|
||||
WithOptions(outputFileOption),
|
||||
WithParent(parent),
|
||||
WithRunFunc(func(args []string) {
|
||||
out := getCompletionsOut()
|
||||
|
||||
if fc, ok := out.(io.Closer); ok {
|
||||
defer fc.Close()
|
||||
}
|
||||
|
||||
if err := WriteZshCompletions(out, parent.Root()); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}),
|
||||
)
|
||||
}
|
|
@ -0,0 +1,19 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"io"
|
||||
"text/template"
|
||||
|
||||
"go.fifitido.net/cmd/opt"
|
||||
)
|
||||
|
||||
func WriteBashCompletions(out io.Writer, rootCmd *Command) error {
|
||||
return bashTpl.Execute(out, map[string]any{
|
||||
"rootCmd": rootCmd,
|
||||
"globalOpts": opt.Globals(),
|
||||
})
|
||||
}
|
||||
|
||||
var bashTpl = template.Must(template.New("bash").Parse(`
|
||||
|
||||
`))
|
|
@ -0,0 +1,19 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"io"
|
||||
"text/template"
|
||||
|
||||
"go.fifitido.net/cmd/opt"
|
||||
)
|
||||
|
||||
func WriteFishCompletions(out io.Writer, rootCmd *Command) error {
|
||||
return fishTpl.Execute(out, map[string]any{
|
||||
"rootCmd": rootCmd,
|
||||
"globalOpts": opt.Globals(),
|
||||
})
|
||||
}
|
||||
|
||||
var fishTpl = template.Must(template.New("fish").Parse(`
|
||||
|
||||
`))
|
|
@ -0,0 +1,19 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"io"
|
||||
"text/template"
|
||||
|
||||
"go.fifitido.net/cmd/opt"
|
||||
)
|
||||
|
||||
func WritePowerShellCompletions(out io.Writer, rootCmd *Command) error {
|
||||
return powerShellTpl.Execute(out, map[string]any{
|
||||
"rootCmd": rootCmd,
|
||||
"globalOpts": opt.Globals(),
|
||||
})
|
||||
}
|
||||
|
||||
var powerShellTpl = template.Must(template.New("PowerShell").Parse(`
|
||||
|
||||
`))
|
|
@ -0,0 +1,19 @@
|
|||
package cmd
|
||||
|
||||
import (
|
||||
"io"
|
||||
"text/template"
|
||||
|
||||
"go.fifitido.net/cmd/opt"
|
||||
)
|
||||
|
||||
func WriteZshCompletions(out io.Writer, rootCmd *Command) error {
|
||||
return zshTpl.Execute(out, map[string]any{
|
||||
"rootCmd": rootCmd,
|
||||
"globalOpts": opt.Globals(),
|
||||
})
|
||||
}
|
||||
|
||||
var zshTpl = template.Must(template.New("zsh").Parse(`
|
||||
|
||||
`))
|
Loading…
Reference in New Issue