forked from scaleway/scaleway-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathissue.go
More file actions
132 lines (103 loc) · 2.41 KB
/
issue.go
File metadata and controls
132 lines (103 loc) · 2.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package feedback
import (
"bytes"
"context"
"fmt"
"html/template"
"log"
"net/url"
"os/exec"
"runtime"
"github.com/scaleway/scaleway-cli/v2/internal/core"
"github.com/scaleway/scaleway-cli/v2/internal/human"
)
const githubURL = "https://github.com/scaleway/scaleway-cli/issues/new"
type issueTemplate string
const (
bug = issueTemplate("bug")
feature = issueTemplate("feature")
linux = "linux"
darwin = "darwin"
windows = "windows"
)
type issue struct {
IssueTemplate issueTemplate
BuildInfo *core.BuildInfo
}
const bugBodyTemplate = `
## Description:
## How to reproduce:
### Command attempted
### Expected Behavior
### Actual Behavior
## More info
## Version
{{ .BuildInfoStr }}
`
const featureBodyTemplate = `
## Description
## How this functionality would be exposed
## References
## Version
{{ .BuildInfoStr }}
`
func (i issue) getURL() string {
u, err := url.Parse(githubURL)
if err != nil {
log.Fatal(err)
}
params := url.Values{}
switch i.IssueTemplate {
case feature:
params.Add("labels", "enhancement")
params.Add("issueTemplate", "feature_request.md")
renderedBody, _ := i.renderTemplate(featureBodyTemplate)
params.Add("body", renderedBody)
case bug:
params.Add("labels", "bug")
params.Add("issueTemplate", "bug_report.md")
renderedBody, _ := i.renderTemplate(bugBodyTemplate)
params.Add("body", renderedBody)
}
u.RawQuery = params.Encode()
return u.String()
}
func (i issue) openInBrowser(ctx context.Context) error {
var err error
var openCmd *exec.Cmd
switch runtime.GOOS {
case linux:
openCmd = exec.Command("xdg-open", i.getURL()) //nolint:gosec
case windows:
openCmd = exec.Command("rundll32", "url.dll,FileProtocolHandler", i.getURL()) //nolint:gosec
case darwin:
openCmd = exec.Command("open", i.getURL()) //nolint:gosec
default:
return fmt.Errorf("unsupported platform")
}
exitCode, err := core.ExecCmd(ctx, openCmd)
if exitCode != 0 {
return &core.CliError{Empty: true, Code: exitCode}
}
return err
}
func (i issue) renderTemplate(bodyTemplate string) (string, error) {
tmpl, err := template.New("configuration").Parse(bodyTemplate)
if err != nil {
return "", err
}
buildInfoStr, err := human.Marshal(i.BuildInfo, nil)
if err != nil {
return "", err
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, struct {
BuildInfoStr string
}{
BuildInfoStr: buildInfoStr,
})
if err != nil {
return "", err
}
return buf.String(), nil
}