-
Notifications
You must be signed in to change notification settings - Fork 329
/
types.go
109 lines (86 loc) · 1.96 KB
/
types.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
package codegen
import (
"fmt"
"gopkg.in/yaml.v3"
"os"
"path"
"syscall"
"text/template"
)
type (
typesDef struct {
// source file path
Source string
// outputDir
// dir where the source file is
outputDir string
Imports []string
Package string `yaml:"package"`
Types map[string]typeDef `yaml:"types"`
}
typeDef struct {
NoIdField bool `yaml:"noIdField"`
LabelResourceType string `yaml:"labelResourceType"`
}
)
func procTypes(mm ...string) (dd []*typesDef, err error) {
dd = make([]*typesDef, 0)
for _, m := range mm {
var (
d = &typesDef{
Source: m,
outputDir: path.Dir(m),
Package: "types",
Types: map[string]typeDef{},
}
)
f, err := os.Open(m)
if err != nil {
return nil, fmt.Errorf("%s read failed: %w", m, err)
}
defer f.Close()
if err := yaml.NewDecoder(f).Decode(d); err != nil {
return nil, fmt.Errorf("%s decode failed: %w", m, err)
}
dd = append(dd, d)
}
return dd, nil
}
// Generates all type set files & accompanying tests
//
// generates 2 files per type definition
func genTypes(tpl *template.Template, dd ...*typesDef) (err error) {
var (
typeGen = tpl.Lookup("type_set.gen.go.tpl")
typeGenTest = tpl.Lookup("type_set.gen_test.go.tpl")
typeLabelsGen = tpl.Lookup("type_labels.gen.go.tpl")
)
for _, d := range dd {
err = goTemplate(path.Join(d.outputDir, "type_set.gen.go"), typeGen, d)
if err != nil {
return
}
err = goTemplate(path.Join(d.outputDir, "type_set.gen_test.go"), typeGenTest, d)
if err != nil {
return
}
labelsOutput := path.Join(d.outputDir, "type_labels.gen.go")
if d.HasLabels() {
err = goTemplate(labelsOutput, typeLabelsGen, d)
} else if err = syscall.Unlink(labelsOutput); os.IsNotExist(err) {
err = nil
}
if err != nil {
return
}
}
return nil
}
func (d typesDef) HasLabels() bool {
for _, t := range d.Types {
if len(t.LabelResourceType) > 0 {
return true
}
}
return false
}