github.com/pengwynn/gh@v1.0.1-0.20140118055701-14327ca3942e/cmd/cmd.go (about) 1 package cmd 2 3 import ( 4 "fmt" 5 "github.com/jingweno/gh/utils" 6 "github.com/kballard/go-shellquote" 7 "os" 8 "os/exec" 9 "strings" 10 ) 11 12 type Cmd struct { 13 Name string 14 Args []string 15 } 16 17 func (cmd Cmd) String() string { 18 return fmt.Sprintf("%s %s", cmd.Name, strings.Join(cmd.Args, " ")) 19 } 20 21 func (cmd *Cmd) WithArg(arg string) *Cmd { 22 if arg != "" { 23 cmd.Args = append(cmd.Args, arg) 24 } 25 26 return cmd 27 } 28 29 func (cmd *Cmd) WithArgs(args ...string) *Cmd { 30 for _, arg := range args { 31 cmd.WithArg(arg) 32 } 33 34 return cmd 35 } 36 37 func (cmd *Cmd) ExecOutput() (string, error) { 38 output, err := exec.Command(cmd.Name, cmd.Args...).CombinedOutput() 39 40 return string(output), err 41 } 42 43 func (cmd *Cmd) Exec() error { 44 binary, lookErr := exec.LookPath(cmd.Name) 45 if lookErr != nil { 46 return fmt.Errorf("command not found: %s", cmd.Name) 47 } 48 49 c := exec.Command(binary, cmd.Args...) 50 c.Stdin = os.Stdin 51 c.Stdout = os.Stdout 52 c.Stderr = os.Stderr 53 54 return c.Run() 55 } 56 57 func New(cmd string) *Cmd { 58 cmds, err := shellquote.Split(cmd) 59 utils.Check(err) 60 61 name := cmds[0] 62 args := make([]string, 0) 63 for _, arg := range cmds[1:] { 64 args = append(args, arg) 65 } 66 return &Cmd{Name: name, Args: args} 67 } 68 69 func NewWithArray(cmd []string) *Cmd { 70 return &Cmd{Name: cmd[0], Args: cmd[1:]} 71 }