graphql-engine/cli/commands/completion.go
Mohd Bilal fe81275445 cli: completion.go refactored to use internal/errors
PR-URL: https://github.com/hasura/graphql-engine-mono/pull/6750
GitOrigin-RevId: 19c9cfe8a98e9f44bee7d3aa24d4b8987dc77b42
2022-11-08 03:53:58 +00:00

110 lines
2.9 KiB
Go

package commands
import (
"fmt"
"os"
"github.com/hasura/graphql-engine/cli/v2"
"github.com/hasura/graphql-engine/cli/v2/internal/errors"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
const completionCmdExample = `# Bash
# Linux
# Add Bash completion file using:
$ sudo hasura completion bash --file=/etc/bash_completion.d/hasura
# Mac
# Install bash-completion using homebrew:
$ brew install bash-completion
# Add to your ~/.bash_profile:
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
# Add the completion file:
$ sudo hasura completion bash --file=$(brew --prefix)/etc/bash_completion.d/hasura
# Windows (Git Bash)
# open git bash
$ mkdir -p ~/.bash_completion.d
# Add the completion file:
$ cd ~ && hasura completion bash --file=.bash_completion.d/hasura
# Add the following to ~/.bash_profile
if [ -f ~/.bash_completion.d/hasura ]; then
. ~/.bash_completion.d/hasura
fi
# restart git bash
# Zsh (using oh-my-zsh)
$ mkdir -p $HOME/.oh-my-zsh/completions
$ hasura completion zsh --file=$HOME/.oh-my-zsh/completions/_hasura
# Reload the shell for the changes to take effect!`
// NewCompletionCmd return the completion command.
func NewCompletionCmd(ec *cli.ExecutionContext) *cobra.Command {
opts := &completionOptions{
EC: ec,
}
completionCmd := &cobra.Command{
Use: "completion [shell]",
Short: "Generate auto completion code",
Args: cobra.ExactArgs(1),
Long: "Output shell completion code for the specified shell (bash or zsh)",
SilenceUsage: true,
Example: completionCmdExample,
PreRunE: func(cmd *cobra.Command, args []string) error {
op := genOpName(cmd, "PreRunE")
ec.Viper = viper.New()
if err := ec.Prepare(); err != nil {
return errors.E(op, err)
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
op := genOpName(cmd, "RunE")
opts.Shell = args[0]
opts.Cmd = cmd
if err := opts.run(); err != nil {
return errors.E(op, err)
}
return nil
},
}
completionCmd.Flags().StringVar(&opts.File, "file", "", "file to which output has to be written")
return completionCmd
}
type completionOptions struct {
EC *cli.ExecutionContext
Shell string
File string
Cmd *cobra.Command
}
func (o *completionOptions) run() error {
var op errors.Op = "commands.completionOptions.run"
var err error
switch o.Shell {
case "bash":
if o.File != "" {
err = o.Cmd.Root().GenBashCompletionFile(o.File)
} else {
err = o.Cmd.Root().GenBashCompletion(os.Stdout)
}
case "zsh":
if o.File != "" {
err = o.Cmd.Root().GenZshCompletionFile(o.File)
} else {
err = o.Cmd.Root().GenZshCompletion(os.Stdout)
}
default:
err = fmt.Errorf("unknown shell: %s. Use bash or zsh", o.Shell)
}
if err != nil {
return errors.E(op, err)
}
return nil
}