Skip to content

Commit eeb6ac2

Browse files
committed
add codersdk autogen
1 parent 9bd101d commit eeb6ac2

File tree

7 files changed

+123
-98
lines changed

7 files changed

+123
-98
lines changed

Makefile

+5-1
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ gen: \
486486
$(DB_GEN_FILES) \
487487
site/src/api/typesGenerated.ts \
488488
coderd/rbac/object_gen.go \
489+
codersdk/rbacresources_gen.go \
489490
docs/admin/prometheus.md \
490491
docs/cli.md \
491492
docs/admin/audit-logs.md \
@@ -611,7 +612,10 @@ examples/examples.gen.json: scripts/examplegen/main.go examples/examples.go $(sh
611612
go run ./scripts/examplegen/main.go > examples/examples.gen.json
612613

613614
coderd/rbac/object_gen.go: scripts/rbacgen/main.go coderd/rbac/object.go
614-
go run scripts/rbacgen/main.go ./coderd/rbac > coderd/rbac/object_gen.go
615+
go run scripts/rbacgen/main.go rbac > coderd/rbac/object_gen.go
616+
617+
codersdk/rbacresources_gen.go: scripts/rbacgen/main.go coderd/rbac/object.go
618+
go run scripts/rbacgen/main.go codersdk > codersdk/rbacresources_gen.go
615619

616620
docs/admin/prometheus.md: scripts/metricsdocgen/main.go scripts/metricsdocgen/metrics
617621
go run scripts/metricsdocgen/main.go

coderd/rbac/object_gen.go

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codersdk/rbacresources.go

-77
This file was deleted.

codersdk/rbacresources_gen.go

+47
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/rbacgen/codersdk.gotmpl

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// Code generated by rbacgen/main.go. DO NOT EDIT.
2+
package codersdk
3+
4+
type RBACResource string
5+
6+
const (
7+
{{- range $element := . }}
8+
Resource{{ pascalCaseName $element.FunctionName }} RBACResource = "{{ $element.Type }}"
9+
{{- end }}
10+
)
11+
12+
const (
13+
{{- range $element := actionsList }}
14+
{{ $element.Enum }} = "{{ $element.Value }}"
15+
{{- end }}
16+
)

scripts/rbacgen/main.go

+49-14
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ package main
22

33
import (
44
"bytes"
5-
"context"
65
_ "embed"
76
"errors"
7+
"flag"
88
"fmt"
99
"go/ast"
1010
"go/format"
@@ -19,17 +19,41 @@ import (
1919
"github.com/coder/coder/v2/coderd/rbac/policy"
2020
)
2121

22-
//go:embed object.gotmpl
23-
var objectGoTpl string
22+
//go:embed rbacobject.gotmpl
23+
var rbacObjectTemplate string
24+
25+
//go:embed codersdk.gotmpl
26+
var codersdkTemplate string
27+
28+
func usage() {
29+
_, _ = fmt.Println("Usage: rbacgen <codersdk|rbac>")
30+
_, _ = fmt.Println("Must choose a template target.")
31+
}
2432

2533
// main will generate a file that lists all rbac objects.
2634
// This is to provide an "AllResources" function that is always
2735
// in sync.
2836
func main() {
29-
ctx, cancel := context.WithCancel(context.Background())
30-
defer cancel()
37+
flag.Parse()
38+
39+
if len(flag.Args()) < 1 {
40+
usage()
41+
os.Exit(1)
42+
}
43+
44+
var source string
45+
switch strings.ToLower(flag.Args()[0]) {
46+
case "codersdk":
47+
source = codersdkTemplate
48+
case "rbac":
49+
source = rbacObjectTemplate
50+
default:
51+
_, _ = fmt.Fprintln(os.Stderr, fmt.Sprintf("%q is not a valid templte target", flag.Args()[0]))
52+
usage()
53+
os.Exit(2)
54+
}
3155

32-
out, err := generate(ctx)
56+
out, err := generateRbacObjects(source)
3357
if err != nil {
3458
log.Fatalf("Generate source: %s", err.Error())
3559
}
@@ -108,25 +132,36 @@ fileDeclLoop:
108132
return actions
109133
}
110134

111-
func generate(ctx context.Context) ([]byte, error) {
135+
type ActionDetails struct {
136+
Enum string
137+
Value string
138+
}
139+
140+
func generateRbacObjects(templateSource string) ([]byte, error) {
112141
// Parse the policy.go file for the action enums
113142
f, err := parser.ParseFile(token.NewFileSet(), "./coderd/rbac/policy/policy.go", nil, parser.ParseComments)
114143
if err != nil {
115144
return nil, fmt.Errorf("parsing policy.go: %w", err)
116145
}
117146
actionMap := fileActions(f)
147+
actionList := make([]ActionDetails, 0)
148+
for value, enum := range actionMap {
149+
actionList = append(actionList, ActionDetails{
150+
Enum: enum,
151+
Value: value,
152+
})
153+
}
154+
slices.SortFunc(actionList, func(a, b ActionDetails) int {
155+
return strings.Compare(a.Enum, b.Enum)
156+
})
118157

119158
var errorList []error
120159
var x int
121160
tpl, err := template.New("object.gotmpl").Funcs(template.FuncMap{
122161
"capitalize": capitalize,
123162
"pascalCaseName": pascalCaseName[string],
124-
"actionsList": func() []string {
125-
tmp := make([]string, 0)
126-
for _, actionEnum := range actionMap {
127-
tmp = append(tmp, actionEnum)
128-
}
129-
return tmp
163+
"actionsList": func() []ActionDetails {
164+
return actionList
130165
},
131166
"actionEnum": func(action policy.Action) string {
132167
x++
@@ -137,7 +172,7 @@ func generate(ctx context.Context) ([]byte, error) {
137172
return v
138173
},
139174
"concat": func(strs ...string) string { return strings.Join(strs, "") },
140-
}).Parse(objectGoTpl)
175+
}).Parse(templateSource)
141176
if err != nil {
142177
return nil, fmt.Errorf("parse template: %w", err)
143178
}

scripts/rbacgen/object.gotmpl renamed to scripts/rbacgen/rbacobject.gotmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func AllResources() []Objecter {
3333
func AllActions() []policy.Action {
3434
return []policy.Action {
3535
{{- range $element := actionsList }}
36-
policy.{{ $element }},
36+
policy.{{ $element.Enum }},
3737
{{- end }}
3838
}
3939
}

0 commit comments

Comments
 (0)