Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 06fc0c4

Browse files
committed
feat: combine rbac and country generation scripts
1 parent 1702c64 commit 06fc0c4

File tree

14 files changed

+1084
-346
lines changed

14 files changed

+1084
-346
lines changed

Makefile

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ gen: \
495495
coderd/rbac/object_gen.go \
496496
codersdk/rbacresources_gen.go \
497497
site/src/api/rbacresourcesGenerated.ts \
498+
site/src/api/countriesGenerated.ts \
498499
docs/admin/integrations/prometheus.md \
499500
docs/reference/cli/index.md \
500501
docs/admin/security/audit-logs.md \
@@ -526,6 +527,7 @@ gen/mark-fresh:
526527
coderd/rbac/object_gen.go \
527528
codersdk/rbacresources_gen.go \
528529
site/src/api/rbacresourcesGenerated.ts \
530+
site/src/api/countriesGenerated.ts \
529531
docs/admin/integrations/prometheus.md \
530532
docs/reference/cli/index.md \
531533
docs/admin/security/audit-logs.md \
@@ -628,17 +630,20 @@ site/src/theme/icons.json: $(wildcard scripts/gensite/*) $(wildcard site/static/
628630
examples/examples.gen.json: scripts/examplegen/main.go examples/examples.go $(shell find ./examples/templates)
629631
go run ./scripts/examplegen/main.go > examples/examples.gen.json
630632

631-
coderd/rbac/object_gen.go: scripts/rbacgen/rbacobject.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
632-
go run scripts/rbacgen/main.go rbac > coderd/rbac/object_gen.go
633+
coderd/rbac/object_gen.go: scripts/typegen/rbacobject.gotmpl scripts/typegen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
634+
go run scripts/typegen/main.go rbac object > coderd/rbac/object_gen.go
633635

634-
codersdk/rbacresources_gen.go: scripts/rbacgen/codersdk.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
636+
codersdk/rbacresources_gen.go: scripts/typegen/codersdk.gotmpl scripts/typegen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
635637
# Do no overwrite codersdk/rbacresources_gen.go directly, as it would make the file empty, breaking
636638
# the `codersdk` package and any parallel build targets.
637-
go run scripts/rbacgen/main.go codersdk > /tmp/rbacresources_gen.go
639+
go run scripts/typegen/main.go rbac codersdk > /tmp/rbacresources_gen.go
638640
mv /tmp/rbacresources_gen.go codersdk/rbacresources_gen.go
639641

640-
site/src/api/rbacresourcesGenerated.ts: scripts/rbacgen/codersdk.gotmpl scripts/rbacgen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
641-
go run scripts/rbacgen/main.go typescript > "$@"
642+
site/src/api/rbacresourcesGenerated.ts: scripts/typegen/codersdk.gotmpl scripts/typegen/main.go coderd/rbac/object.go coderd/rbac/policy/policy.go
643+
go run scripts/typegen/main.go rbac typescript > "$@"
644+
645+
site/src/api/countriesGenerated.ts: scripts/typegen/countries.tstmpl scripts/typegen/main.go codersdk/countries.go
646+
go run scripts/typegen/main.go countries > "$@"
642647

643648
docs/admin/integrations/prometheus.md: scripts/metricsdocgen/main.go scripts/metricsdocgen/metrics
644649
go run scripts/metricsdocgen/main.go

coderd/rbac/object_gen.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

codersdk/rbacresources_gen.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/apitypings/main.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package main
33
import (
44
"bytes"
55
"context"
6-
"encoding/json"
76
"fmt"
87
"go/types"
98
"os"
@@ -25,7 +24,6 @@ import (
2524
"cdr.dev/slog"
2625
"cdr.dev/slog/sloggers/sloghuman"
2726
"github.com/coder/coder/v2/coderd/util/slice"
28-
"github.com/coder/coder/v2/codersdk"
2927
)
3028

3129
var (
@@ -60,13 +58,6 @@ func main() {
6058

6159
_, _ = fmt.Print("// Code generated by 'make site/src/api/typesGenerated.ts'. DO NOT EDIT.\n\n")
6260

63-
countriesTS, err := generateSliceOfObjectsTypeScript("countries", codersdk.Countries)
64-
if err != nil {
65-
log.Fatal(ctx, fmt.Sprintf("generate countries typeScript: %s", err.Error()))
66-
}
67-
_, _ = fmt.Print("// The code below is generated from codersdk/countries.go.\n")
68-
_, _ = fmt.Print(countriesTS, "\n")
69-
7061
for _, baseDir := range baseDirs {
7162
_, _ = fmt.Printf("// The code below is generated from %s.\n\n", strings.TrimPrefix(baseDir, "./"))
7263
output, err := Generate(baseDir, external...)
@@ -1115,26 +1106,3 @@ func (Generator) isBuiltIn(name string) (bool, string) {
11151106
func indentedComment(comment string) string {
11161107
return fmt.Sprintf("%s// %s", indent, comment)
11171108
}
1118-
1119-
func generateSliceOfObjectsTypeScript(name string, data interface{}) (string, error) {
1120-
var sb strings.Builder
1121-
_, _ = sb.WriteString(fmt.Sprintf("export const %s = [\n", name))
1122-
1123-
val := reflect.ValueOf(data)
1124-
if val.Kind() != reflect.Slice {
1125-
return "", xerrors.New("data must be a slice")
1126-
}
1127-
1128-
for i := 0; i < val.Len(); i++ {
1129-
item := val.Index(i).Interface()
1130-
jsonBytes, err := json.Marshal(item)
1131-
if err != nil {
1132-
return "", xerrors.Errorf("marshal item: %w", err)
1133-
}
1134-
_, _ = sb.WriteString("\t")
1135-
_, _ = sb.Write(jsonBytes)
1136-
_, _ = sb.WriteString(",\n")
1137-
}
1138-
_, _ = sb.WriteString("]\n\n")
1139-
return sb.String(), nil
1140-
}

scripts/apitypings/main_test.go

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package main
88

99
import (
1010
"flag"
11-
"fmt"
1211
"os"
1312
"path/filepath"
1413
"strings"
@@ -52,36 +51,3 @@ func TestGeneration(t *testing.T) {
5251
})
5352
}
5453
}
55-
56-
func TestGenerateSliceOfObjectsTypeScript(t *testing.T) {
57-
58-
t.Run("Valid slice input", func(t *testing.T) {
59-
t.Parallel()
60-
type testObject struct {
61-
Name string `json:"name"`
62-
Value int `json:"value"`
63-
}
64-
65-
testData := []testObject{
66-
{Name: "Item1", Value: 1},
67-
{Name: "Item2", Value: 2},
68-
{Name: "Item3", Value: 3},
69-
}
70-
71-
expected := fmt.Sprintf(`export const testObjects = [
72-
{"name":"Item1","value":1},
73-
{"name":"Item2","value":2},
74-
{"name":"Item3","value":3},%s]%s%s`, "\n", "\n", "\n")
75-
76-
result, err := generateSliceOfObjectsTypeScript("testObjects", testData)
77-
require.NoError(t, err, "generate slice of objects")
78-
require.Equal(t, expected, result, "generated TypeScript matches expected output")
79-
})
80-
81-
t.Run("Invalid non-slice input", func(t *testing.T) {
82-
t.Parallel()
83-
_, err := generateSliceOfObjectsTypeScript("invalidData", "not a slice")
84-
require.Error(t, err, "should return error for non-slice input")
85-
require.Contains(t, err.Error(), "data must be a slice", "error message should indicate invalid input type")
86-
})
87-
}

scripts/rbacgen/codersdk.gotmpl renamed to scripts/typegen/codersdk.gotmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Code generated by rbacgen/main.go. DO NOT EDIT.
1+
// Code generated by typegen/main.go. DO NOT EDIT.
22
package codersdk
33

44
type RBACResource string

scripts/typegen/countries.tstmpl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Code generated by typegen/main.go. DO NOT EDIT.
2+
3+
// Countries represents all supported countries with their flags
4+
export const countries = [
5+
{{- range $country := . }}
6+
{
7+
name: "{{ $country.Name }}",
8+
flag: "{{ $country.Flag }}",
9+
},
10+
{{- end }}
11+
];

scripts/rbacgen/main.go renamed to scripts/typegen/main.go

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"golang.org/x/xerrors"
2020

2121
"github.com/coder/coder/v2/coderd/rbac/policy"
22+
"github.com/coder/coder/v2/codersdk"
2223
)
2324

2425
//go:embed rbacobject.gotmpl
@@ -30,12 +31,17 @@ var codersdkTemplate string
3031
//go:embed typescript.tstmpl
3132
var typescriptTemplate string
3233

34+
//go:embed countries.tstmpl
35+
var countriesTemplate string
36+
3337
func usage() {
34-
_, _ = fmt.Println("Usage: rbacgen <codersdk|rbac>")
35-
_, _ = fmt.Println("Must choose a template target.")
38+
_, _ = fmt.Println("Usage: typegen <type> [template]")
39+
_, _ = fmt.Println("Types:")
40+
_, _ = fmt.Println(" rbac <object|codersdk|typescript> - Generate RBAC related files")
41+
_, _ = fmt.Println(" countries - Generate countries TypeScript")
3642
}
3743

38-
// main will generate a file that lists all rbac objects.
44+
// main will generate a file based on the type and template specified.
3945
// This is to provide an "AllResources" function that is always
4046
// in sync.
4147
func main() {
@@ -46,15 +52,43 @@ func main() {
4652
os.Exit(1)
4753
}
4854

49-
formatSource := format.Source
55+
var (
56+
out []byte
57+
err error
58+
)
59+
5060
// It did not make sense to have 2 different generators that do essentially
5161
// the same thing, but different format for the BE and the sdk.
5262
// So the argument switches the go template to use.
53-
var source string
5463
switch strings.ToLower(flag.Args()[0]) {
64+
case "rbac":
65+
if len(flag.Args()) < 2 {
66+
usage()
67+
os.Exit(1)
68+
}
69+
out, err = generateRBAC(flag.Args()[1])
70+
case "countries":
71+
out, err = generateCountries()
72+
default:
73+
_, _ = fmt.Fprintf(os.Stderr, "%q is not a valid type\n", flag.Args()[0])
74+
usage()
75+
os.Exit(2)
76+
}
77+
78+
if err != nil {
79+
log.Fatalf("Generate source: %s", err.Error())
80+
}
81+
82+
_, _ = fmt.Fprint(os.Stdout, string(out))
83+
}
84+
85+
func generateRBAC(tmpl string) ([]byte, error) {
86+
formatSource := format.Source
87+
var source string
88+
switch strings.ToLower(tmpl) {
5589
case "codersdk":
5690
source = codersdkTemplate
57-
case "rbac":
91+
case "object":
5892
source = rbacObjectTemplate
5993
case "typescript":
6094
source = typescriptTemplate
@@ -63,22 +97,29 @@ func main() {
6397
return src, nil
6498
}
6599
default:
66-
_, _ = fmt.Fprintf(os.Stderr, "%q is not a valid template target\n", flag.Args()[0])
67-
usage()
68-
os.Exit(2)
100+
return nil, xerrors.Errorf("%q is not a valid RBAC template target", tmpl)
69101
}
70102

71103
out, err := generateRbacObjects(source)
72104
if err != nil {
73-
log.Fatalf("Generate source: %s", err.Error())
105+
return nil, err
74106
}
107+
return formatSource(out)
108+
}
75109

76-
formatted, err := formatSource(out)
110+
func generateCountries() ([]byte, error) {
111+
tmpl, err := template.New("countries.tstmpl").Parse(countriesTemplate)
77112
if err != nil {
78-
log.Fatalf("Format template: %s", err.Error())
113+
return nil, xerrors.Errorf("parse template: %w", err)
79114
}
80115

81-
_, _ = fmt.Fprint(os.Stdout, string(formatted))
116+
var out bytes.Buffer
117+
err = tmpl.Execute(&out, codersdk.Countries)
118+
if err != nil {
119+
return nil, xerrors.Errorf("execute template: %w", err)
120+
}
121+
122+
return out.Bytes(), nil
82123
}
83124

84125
func pascalCaseName[T ~string](name T) string {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Code generated by rbacgen/main.go. DO NOT EDIT.
1+
// Code generated by typegen/main.go. DO NOT EDIT.
22
package rbac
33

44
import "github.com/coder/coder/v2/coderd/rbac/policy"

scripts/rbacgen/typescript.tstmpl renamed to scripts/typegen/typescript.tstmpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Code generated by rbacgen/main.go. DO NOT EDIT.
1+
// Code generated by typegen/main.go. DO NOT EDIT.
22

33
import type { RBACAction, RBACResource } from "./typesGenerated";
44

0 commit comments

Comments
 (0)