-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathgenerate.go
136 lines (117 loc) · 2.93 KB
/
generate.go
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
133
134
135
136
package main
import (
"bytes"
_ "embed"
"flag"
"io"
"os"
"path/filepath"
"text/template"
)
//go:embed template_markdown.go.tmpl
var webhookMarkdownTemplate string
//go:embed template_webhook_event.go.tmpl
var webhookEventTemplate string
//go:embed template_webhook_event_tests.go.tmpl
var webhookTestsTemplate string
//go:embed template_webhook_event_types.go.tmpl
var webhookTypesTemplate string
func main() {
outputDir := flag.String("output", "githubevents", "output directory")
docs := flag.Bool("docs", false, "generate markdown docs")
flag.Parse()
if *outputDir == "" {
panic("output directory is empty")
}
// when -docs is set, create a list of all supported markdown events as yaml on stdout
// todo(cbrgm): clean this up a little bit
if *docs {
err := ExecuteMarkdownTemplate("", webhookMarkdownTemplate, params)
if err != nil {
panic(err)
}
return
}
out := filepath.Join(".", *outputDir)
err := os.MkdirAll(out, os.ModePerm)
if err != nil {
panic("failed to create output directory")
}
// create events.go
err = ExecuteWebhookEventTemplate(filepath.Join(out, "events"), params)
if err != nil {
panic(err)
}
// create individual files for each webhook event type
// webhook events_*.go files and events_*_test.go files are generated
for _, param := range params.Webhooks {
fileName := "events_" + param.Name
outFile := filepath.Join(out, fileName)
err := ExecuteWebhookEventTypesTemplate(outFile, TemplateParameters{
Webhooks: []GithubWebhooks{param},
})
if err != nil {
panic(err)
}
}
}
func ExecuteWebhookEventTemplate(file string, data any) error {
err := ExecuteTemplate(file+".go", webhookEventTemplate, data)
if err != nil {
return err
}
return nil
}
func ExecuteWebhookEventTypesTemplate(file string, data any) error {
err := ExecuteTemplate(file+".go", webhookTypesTemplate, data)
if err != nil {
return err
}
err = ExecuteTemplate(file+"_test.go", webhookTestsTemplate, data)
if err != nil {
return err
}
return nil
}
// ExecuteWebhookEventTypesTemplate renders the named template and writes to io.Writer wr.
func ExecuteTemplate(file string, tmpl string, data any) error {
wr := os.Stdout
if output := file; output != "" {
wri, err := os.Create(output)
if err != nil {
return err
}
wr = wri
defer wr.Close()
}
buf := new(bytes.Buffer)
t, err := template.New("").Parse(tmpl)
if err != nil {
return err
}
err = t.ExecuteTemplate(buf, "", data)
if err != nil {
return err
}
src, err := format(buf)
if err != nil {
return err
}
_, err = io.Copy(wr, src)
return err
}
// ExecuteMarkdownTemplate renders the named template and writes to io.Writer wr.
func ExecuteMarkdownTemplate(_ string, tmpl string, data any) error {
wr := os.Stdout
buf := new(bytes.Buffer)
t, err := template.New("").Parse(tmpl)
if err != nil {
return err
}
err = t.ExecuteTemplate(buf, "", data)
if err != nil {
return err
}
_, err = io.Copy(wr, buf)
return err
}