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  }