github.com/divan/complete@v0.0.0-20170515130636-337e95201af7/cmd/install/install.go (about) 1 package install 2 3 import ( 4 "errors" 5 "os" 6 "os/user" 7 "path/filepath" 8 9 "github.com/hashicorp/go-multierror" 10 ) 11 12 type installer interface { 13 Install(cmd, bin string) error 14 Uninstall(cmd, bin string) error 15 } 16 17 // Install complete command given: 18 // cmd: is the command name 19 func Install(cmd string) error { 20 is := installers() 21 if len(is) == 0 { 22 return errors.New("Did not found any shells to install") 23 } 24 bin, err := getBinaryPath() 25 if err != nil { 26 return err 27 } 28 29 for _, i := range is { 30 errI := i.Install(cmd, bin) 31 if errI != nil { 32 multierror.Append(err, errI) 33 } 34 } 35 36 return err 37 } 38 39 // Uninstall complete command given: 40 // cmd: is the command name 41 func Uninstall(cmd string) error { 42 is := installers() 43 if len(is) == 0 { 44 return errors.New("Did not found any shells to uninstall") 45 } 46 bin, err := getBinaryPath() 47 if err != nil { 48 return err 49 } 50 51 for _, i := range is { 52 errI := i.Uninstall(cmd, bin) 53 if errI != nil { 54 multierror.Append(err, errI) 55 } 56 } 57 58 return err 59 } 60 61 func installers() (i []installer) { 62 if f := rcFile(".bashrc"); f != "" { 63 i = append(i, bash{f}) 64 } 65 if f := rcFile(".zshrc"); f != "" { 66 i = append(i, zsh{f}) 67 } 68 return 69 } 70 71 func getBinaryPath() (string, error) { 72 bin, err := os.Executable() 73 if err != nil { 74 return "", err 75 } 76 return filepath.Abs(bin) 77 } 78 79 func rcFile(name string) string { 80 u, err := user.Current() 81 if err != nil { 82 return "" 83 } 84 return filepath.Join(u.HomeDir, name) 85 }