58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
// ValidateCmd returns unknown command error or Help display if help flag set
|
|
func ValidateCmd(cmd *cobra.Command, args []string) error {
|
|
var unknownCmd string
|
|
var skipNext bool
|
|
|
|
for _, arg := range args {
|
|
// search for help flag
|
|
if arg == "--help" || arg == "-h" {
|
|
return cmd.Help()
|
|
}
|
|
|
|
// check if the current arg is a flag
|
|
switch {
|
|
case len(arg) > 0 && (arg[0] == '-'):
|
|
// the next arg should be skipped if the current arg is a
|
|
// flag and does not use "=" to assign the flag's value
|
|
if !strings.Contains(arg, "=") {
|
|
skipNext = true
|
|
} else {
|
|
skipNext = false
|
|
}
|
|
case skipNext:
|
|
// skip current arg
|
|
skipNext = false
|
|
case unknownCmd == "":
|
|
// unknown command found
|
|
// continue searching for help flag
|
|
unknownCmd = arg
|
|
}
|
|
}
|
|
|
|
// return the help screen if no unknown command is found
|
|
if unknownCmd != "" {
|
|
err := fmt.Sprintf("unknown command \"%s\" for \"%s\"", unknownCmd, cmd.CalledAs())
|
|
|
|
// build suggestions for unknown argument
|
|
if suggestions := cmd.SuggestionsFor(unknownCmd); len(suggestions) > 0 {
|
|
err += "\n\nDid you mean this?\n"
|
|
for _, s := range suggestions {
|
|
err += fmt.Sprintf("\t%v\n", s)
|
|
}
|
|
}
|
|
return errors.New(err)
|
|
}
|
|
|
|
return cmd.Help()
|
|
}
|