-
Notifications
You must be signed in to change notification settings - Fork 2
/
role_register.go
132 lines (111 loc) · 3.01 KB
/
role_register.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
package generator
import (
"fmt"
"io/fs"
"path/filepath"
"strings"
"github.com/hashicorp/go-hclog"
"github.com/sev-2/raiden/pkg/logger"
"github.com/sev-2/raiden/pkg/utils"
)
var RoleRegisterLogger hclog.Logger = logger.HcLog().Named("generator.role_register")
// ----- Define type, variable and constant -----
type (
GenerateRegisterRoleData struct {
Imports []string
Package string
Roles []string
}
)
const (
RoleRegisterFilename = "roles.go"
RoleRegisterDir = "internal/bootstrap"
RoleRegisterTemplate = `// Code generated by raiden-cli; DO NOT EDIT.
package {{ .Package }}
{{if gt (len .Imports) 0 }}
import (
{{- range .Imports}}
{{.}}
{{- end}}
)
{{end }}
func RegisterRoles() {
resource.RegisterRole(
{{- range .Roles}}
&roles.{{.}}{},
{{- end}}
)
}
`
)
func GenerateRoleRegister(basePath string, projectName string, generateFn GenerateFn) error {
roleRegisterDir := filepath.Join(basePath, RoleRegisterDir)
RoleRegisterLogger.Trace("create bootstrap folder if not exist", roleRegisterDir)
if exist := utils.IsFolderExists(roleRegisterDir); !exist {
if err := utils.CreateFolder(roleRegisterDir); err != nil {
return err
}
}
roleDir := filepath.Join(basePath, RoleDir)
RoleRegisterLogger.Trace("create roles folder if not exist", roleDir)
if exist := utils.IsFolderExists(roleDir); !exist {
if err := utils.CreateFolder(roleDir); err != nil {
return err
}
}
// scan all role
roleList, err := WalkScanRole(roleDir)
if err != nil {
return err
}
input, err := createRoleRegisterInput(projectName, roleRegisterDir, roleList)
if err != nil {
return err
}
RoleRegisterLogger.Debug("generate role register", "path", input.OutputPath)
return generateFn(input, nil)
}
func createRoleRegisterInput(projectName string, roleRegisterDir string, roleList []string) (input GenerateInput, err error) {
// set file path
filePath := filepath.Join(roleRegisterDir, RoleRegisterFilename)
// set imports path
imports := []string{
fmt.Sprintf("%q", "github.com/sev-2/raiden/pkg/resource"),
}
if len(roleList) > 0 {
rolesImportPath := fmt.Sprintf("%s/internal/roles", utils.ToGoModuleName(projectName))
imports = append(imports, fmt.Sprintf("%q", rolesImportPath))
}
// set passed parameter
data := GenerateRegisterRoleData{
Package: "bootstrap",
Imports: imports,
Roles: roleList,
}
input = GenerateInput{
BindData: data,
Template: RoleRegisterTemplate,
TemplateName: "roleRegisterTemplate",
OutputPath: filePath,
}
return
}
func WalkScanRole(roleDir string) ([]string, error) {
ModelRegisterLogger.Trace("scan registered all roles", "path", roleDir)
roles := make([]string, 0)
err := filepath.Walk(roleDir, func(path string, info fs.FileInfo, err error) error {
if strings.HasSuffix(path, ".go") {
ModelRegisterLogger.Trace("collect roles", "file-path", path)
rs, e := getStructByBaseName(path, "RoleBase")
if e != nil {
return e
}
roles = append(roles, rs...)
}
return nil
})
if err != nil {
return nil, err
}
return roles, nil
}