435c0d9fc8
This PR switches the Nomad repository from using govendor to Go modules for managing dependencies. Aspects of the Nomad workflow remain pretty much the same. The usual Makefile targets should continue to work as they always did. The API submodule simply defers to the parent Nomad version on the repository, keeping the semantics of API versioning that currently exists.
129 lines
2.7 KiB
Go
129 lines
2.7 KiB
Go
// Package cmd used for command line options for the complete tool
|
|
package cmd
|
|
|
|
import (
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/posener/complete/cmd/install"
|
|
)
|
|
|
|
// CLI for command line
|
|
type CLI struct {
|
|
Name string
|
|
InstallName string
|
|
UninstallName string
|
|
|
|
install bool
|
|
uninstall bool
|
|
yes bool
|
|
}
|
|
|
|
const (
|
|
defaultInstallName = "install"
|
|
defaultUninstallName = "uninstall"
|
|
)
|
|
|
|
// Run is used when running complete in command line mode.
|
|
// this is used when the complete is not completing words, but to
|
|
// install it or uninstall it.
|
|
func (f *CLI) Run() bool {
|
|
err := f.validate()
|
|
if err != nil {
|
|
os.Stderr.WriteString(err.Error() + "\n")
|
|
os.Exit(1)
|
|
}
|
|
|
|
switch {
|
|
case f.install:
|
|
f.prompt()
|
|
err = install.Install(f.Name)
|
|
case f.uninstall:
|
|
f.prompt()
|
|
err = install.Uninstall(f.Name)
|
|
default:
|
|
// non of the action flags matched,
|
|
// returning false should make the real program execute
|
|
return false
|
|
}
|
|
|
|
if err != nil {
|
|
fmt.Printf("%s failed! %s\n", f.action(), err)
|
|
os.Exit(3)
|
|
}
|
|
fmt.Println("Done!")
|
|
return true
|
|
}
|
|
|
|
// prompt use for approval
|
|
// exit if approval was not given
|
|
func (f *CLI) prompt() {
|
|
defer fmt.Println(f.action() + "ing...")
|
|
if f.yes {
|
|
return
|
|
}
|
|
fmt.Printf("%s completion for %s? ", f.action(), f.Name)
|
|
var answer string
|
|
fmt.Scanln(&answer)
|
|
|
|
switch strings.ToLower(answer) {
|
|
case "y", "yes":
|
|
return
|
|
default:
|
|
fmt.Println("Cancelling...")
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// AddFlags adds the CLI flags to the flag set.
|
|
// If flags is nil, the default command line flags will be taken.
|
|
// Pass non-empty strings as installName and uninstallName to override the default
|
|
// flag names.
|
|
func (f *CLI) AddFlags(flags *flag.FlagSet) {
|
|
if flags == nil {
|
|
flags = flag.CommandLine
|
|
}
|
|
|
|
if f.InstallName == "" {
|
|
f.InstallName = defaultInstallName
|
|
}
|
|
if f.UninstallName == "" {
|
|
f.UninstallName = defaultUninstallName
|
|
}
|
|
|
|
if flags.Lookup(f.InstallName) == nil {
|
|
flags.BoolVar(&f.install, f.InstallName, false,
|
|
fmt.Sprintf("Install completion for %s command", f.Name))
|
|
}
|
|
if flags.Lookup(f.UninstallName) == nil {
|
|
flags.BoolVar(&f.uninstall, f.UninstallName, false,
|
|
fmt.Sprintf("Uninstall completion for %s command", f.Name))
|
|
}
|
|
if flags.Lookup("y") == nil {
|
|
flags.BoolVar(&f.yes, "y", false, "Don't prompt user for typing 'yes' when installing completion")
|
|
}
|
|
}
|
|
|
|
// validate the CLI
|
|
func (f *CLI) validate() error {
|
|
if f.install && f.uninstall {
|
|
return errors.New("Install and uninstall are mutually exclusive")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// action name according to the CLI values.
|
|
func (f *CLI) action() string {
|
|
switch {
|
|
case f.install:
|
|
return "Install"
|
|
case f.uninstall:
|
|
return "Uninstall"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|