all repos

viye @ 4e123d7d637534d8d950d5453448cba198a520f9

my shot at reimplementing xiki

viye/internal/plumbing/gobin/gobin.go (view raw)

Oleksandr Smirnov Oleksandr Smirnov
olexsmir@gmail.com
show files content, 2 months ago
1
package gobin
2
3
import (
4
	"os/exec"
5
	"strings"
6
7
	"github.com/olexsmir/viye/internal/viye"
8
)
9
10
const menu = `- build
11
- test
12
- run
13
- generate
14
- doc
15
- mod/
16
`
17
18
const modMenu = `- tidy
19
- download
20
- verify
21
- init`
22
23
type Tool struct{}
24
25
func (Tool) Name() string { return "go" }
26
func (Tool) Match(ctx *viye.Context) bool {
27
	return ctx.Cmd == "go" || (len(ctx.Path) > 0 && ctx.Path[0] == "go")
28
}
29
30
func (Tool) Execute(ctx *viye.Context) (string, error) {
31
	var subcmd string
32
	var args []string
33
34
	if ctx.Cmd == "go" {
35
		// cmd-based: 'go build ./...' → Cmd="go", Args=["build","./..."]
36
		if len(ctx.Args) == 0 {
37
			return menu, nil
38
		}
39
		subcmd = ctx.Args[0]
40
		args = ctx.Args[1:]
41
	} else {
42
		// path-based: join remaining path as a command line, then re-split
43
		if len(ctx.Path) < 2 {
44
			return menu, nil
45
		}
46
		parts := strings.Fields(strings.Join(ctx.Path[1:], " "))
47
		if len(parts) == 0 {
48
			return menu, nil
49
		}
50
		subcmd = parts[0]
51
		args = parts[1:]
52
	}
53
54
	switch subcmd {
55
	case "mod":
56
		if len(args) == 0 {
57
			return modMenu, nil
58
		}
59
	case "build", "test", "generate", "doc", "install", "run", "fmt", "vet", "clean", "env", "fix", "list", "tool", "version":
60
	default:
61
		return menu, nil
62
	}
63
64
	return runGo(ctx.Dir, subcmd, args...)
65
}
66
67
func runGo(dir, subcmd string, args ...string) (string, error) {
68
	cmd := exec.Command("go", append([]string{subcmd}, args...)...)
69
	cmd.Dir = dir
70
	out, _ := cmd.CombinedOutput()
71
	return viye.FormatOutput(string(out)), nil
72
}