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

import (
J
Jingwen Owen Ou 已提交
4
	"fmt"
J
Jingwen Owen Ou 已提交
5
	"os"
J
Jingwen Owen Ou 已提交
6
	"os/exec"
J
Jingwen Owen Ou 已提交
7
	"strings"
J
Jingwen Owen Ou 已提交
8 9
)

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

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

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

	return cmd
}

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

	return cmd
}

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

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

41
func (cmd *Cmd) Exec() error {
J
Jingwen Owen Ou 已提交
42 43 44 45 46 47
	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 已提交
48 49 50 51 52 53 54
	c.Stdin = os.Stdin
	c.Stdout = os.Stdout
	c.Stderr = os.Stderr

	return c.Run()
}

55
func New(name string) *Cmd {
J
Jingwen Owen Ou 已提交
56
	return &Cmd{Name: name, Args: make([]string, 0)}
J
Jingwen Owen Ou 已提交
57
}
J
Jingwen Owen Ou 已提交
58 59

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