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