complete/cmd.go

88 lines
1.8 KiB
Go

package complete
import (
"errors"
"flag"
"fmt"
"os"
"strings"
"github.com/posener/complete/install"
)
func runCommandLine(cmd string) {
c := parseFlags(cmd)
err := c.validate()
if err != nil {
os.Stderr.WriteString(err.Error() + "\n")
os.Exit(1)
}
if !c.yes && !prompt(c.action(), cmd) {
fmt.Println("Cancelling...")
os.Exit(2)
}
fmt.Println(c.action() + "ing...")
if c.install {
err = install.Install(cmd, c.root)
} else {
err = install.Uninstall(cmd, c.root)
}
if err != nil {
fmt.Printf("%s failed! %s\n", c.action(), err)
os.Exit(3)
}
fmt.Println("Done!")
}
func prompt(action, cmd string) bool {
fmt.Printf("%s bash completion for %s? ", action, cmd)
var answer string
fmt.Scanln(&answer)
switch strings.ToLower(answer) {
case "y", "yes":
return true
default:
return false
}
}
type config struct {
install bool
uninstall bool
root bool
yes bool
}
func parseFlags(cmd string) config {
var c config
flag.BoolVar(&c.install, "install", false,
fmt.Sprintf("Install bash completion for %s command", cmd))
flag.BoolVar(&c.uninstall, "uninstall", false,
fmt.Sprintf("Uninstall bash completion for %s command", cmd))
flag.BoolVar(&c.root, "root", false,
"(Un)Install as root:\n"+
" (Un)Install at /etc/bash_completion.d/ (user should have write permissions to that directory).\n"+
" If not set, a complete command will be added(removed) to ~/.bashrc")
flag.BoolVar(&c.yes, "y", false, "Don't prompt user for typing 'yes'")
flag.Parse()
return c
}
func (c config) validate() error {
if c.install && c.uninstall {
return errors.New("Install and uninstall are exclusive")
}
if !c.install && !c.uninstall {
return errors.New("Must specify -install or -uninstall")
}
return nil
}
func (c config) action() string {
if c.install {
return "Install"
}
return "Uninstall"
}