cmd.go 1.2 KB
Newer Older
1
package cmd
J
Jingwen Owen Ou 已提交
2 3

import (
J
Jingwen Owen Ou 已提交
4
	"fmt"
J
Jingwen Owen Ou 已提交
5 6
	"github.com/jingweno/gh/utils"
	"github.com/kballard/go-shellquote"
J
Jingwen Owen Ou 已提交
7
	"os"
J
Jingwen Owen Ou 已提交
8
	"os/exec"
J
Jingwen Owen Ou 已提交
9
	"strings"
J
Jingwen Owen Ou 已提交
10 11
)

12
type Cmd struct {
J
Jingwen Owen Ou 已提交
13 14 15 16
	Name string
	Args []string
}

J
Jingwen Owen Ou 已提交
17 18 19 20
func (cmd Cmd) String() string {
	return fmt.Sprintf("%s %s", cmd.Name, strings.Join(cmd.Args, " "))
}

21
func (cmd *Cmd) WithArg(arg string) *Cmd {
J
Jingwen Owen Ou 已提交
22 23 24
	if arg != "" {
		cmd.Args = append(cmd.Args, arg)
	}
J
Jingwen Owen Ou 已提交
25 26 27 28

	return cmd
}

29
func (cmd *Cmd) WithArgs(args ...string) *Cmd {
J
Jingwen Owen Ou 已提交
30 31 32
	for _, arg := range args {
		cmd.WithArg(arg)
	}
33 34 35 36

	return cmd
}

37
func (cmd *Cmd) ExecOutput() (string, error) {
38
	output, err := exec.Command(cmd.Name, cmd.Args...).CombinedOutput()
J
Jingwen Owen Ou 已提交
39

40
	return string(output), err
J
Jingwen Owen Ou 已提交
41 42
}

43
func (cmd *Cmd) Exec() error {
J
Jingwen Owen Ou 已提交
44 45 46 47 48 49
	binary, lookErr := exec.LookPath(cmd.Name)
	if lookErr != nil {
		return fmt.Errorf("command not found: %s", cmd.Name)
	}

	c := exec.Command(binary, cmd.Args...)
J
Jingwen Owen Ou 已提交
50 51 52 53 54 55 56
	c.Stdin = os.Stdin
	c.Stdout = os.Stdout
	c.Stderr = os.Stderr

	return c.Run()
}

J
Jingwen Owen Ou 已提交
57 58 59 60 61 62 63 64 65 66
func New(cmd string) *Cmd {
	cmds, err := shellquote.Split(cmd)
	utils.Check(err)

	name := cmds[0]
	args := make([]string, 0)
	for _, arg := range cmds[1:] {
		args = append(args, arg)
	}
	return &Cmd{Name: name, Args: args}
J
Jingwen Owen Ou 已提交
67
}
J
Jingwen Owen Ou 已提交
68 69

func NewWithArray(cmd []string) *Cmd {
J
Jingwen Owen Ou 已提交
70
	return &Cmd{Name: cmd[0], Args: cmd[1:]}
J
Jingwen Owen Ou 已提交
71
}