mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
refactor: deduplicate utility helpers across the codebase (#23338)
Audited exported helpers in `coderd/util/*`, `testutil`, `cryptorand`, and friends, then replaced duplicated implementations with canonical versions. - **fix: `maps.SortedKeys` generic signature** — value type was hardcoded to `any`, making it impossible to actually call. Added second type parameter `V any`. Added table-driven tests with `cmp.Diff`. - **refactor: replace ad-hoc ptr helpers with `ptr.Ref`** — removed `int64Ptr`, `stringPtr`, `boolPtr`, `i64ptr`, `strPtr`, `PtrInt32` across 6 files. - **refactor: replace local `sortedKeys`/`sortKeys` with `maps.SortedKeys`** — now that the signature is fixed, scripts can use it. - **refactor: replace hand-rolled `capitalize` with `strings.Capitalize`** — the typegen version was also not UTF-8 safe. > 🤖 This PR was created with the help of Coder Agents, and was reviewed by my human. 🧑💻
This commit is contained in:
@@ -5,12 +5,12 @@ import (
|
||||
"flag"
|
||||
"log"
|
||||
"os"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/util/maps"
|
||||
"github.com/coder/coder/v2/enterprise/audit"
|
||||
"github.com/coder/coder/v2/scripts/atomicwrite"
|
||||
)
|
||||
@@ -96,7 +96,7 @@ func readAuditDoc() ([]byte, error) {
|
||||
// Writes a markdown table of audit log resources to a buffer
|
||||
func updateAuditDoc(doc []byte, auditableResourcesMap AuditableResourcesMap) ([]byte, error) {
|
||||
// We must sort the resources to ensure table ordering
|
||||
sortedResourceNames := sortKeys(auditableResourcesMap)
|
||||
sortedResourceNames := maps.SortedKeys(auditableResourcesMap)
|
||||
|
||||
i := bytes.Index(doc, generatorPrefix)
|
||||
if i < 0 {
|
||||
@@ -135,7 +135,7 @@ func updateAuditDoc(doc []byte, auditableResourcesMap AuditableResourcesMap) ([]
|
||||
_, _ = buffer.WriteString("|" + readableResourceName + "<br><i>" + auditActionsString + "</i>|<table><thead><tr><th>Field</th><th>Tracked</th></tr></thead><tbody>" + "|")
|
||||
|
||||
// We must sort the field names to ensure sub-table ordering
|
||||
sortedFieldNames := sortKeys(auditableResourcesMap[resourceName])
|
||||
sortedFieldNames := maps.SortedKeys(auditableResourcesMap[resourceName])
|
||||
|
||||
for _, fieldName := range sortedFieldNames {
|
||||
isTracked := auditableResourcesMap[resourceName][fieldName]
|
||||
@@ -153,12 +153,3 @@ func updateAuditDoc(doc []byte, auditableResourcesMap AuditableResourcesMap) ([]
|
||||
func writeAuditDoc(doc []byte) error {
|
||||
return atomicwrite.File(auditDocFile, doc)
|
||||
}
|
||||
|
||||
func sortKeys[T any](stringMap map[string]T) []string {
|
||||
var keyNames []string
|
||||
for key := range stringMap {
|
||||
keyNames = append(keyNames, key)
|
||||
}
|
||||
sort.Strings(keyNames)
|
||||
return keyNames
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import (
|
||||
"github.com/prometheus/common/expfmt"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/util/maps"
|
||||
"github.com/coder/coder/v2/scripts/atomicwrite"
|
||||
)
|
||||
|
||||
@@ -176,7 +177,7 @@ func updatePrometheusDoc(doc []byte, metricFamilies []*dto.MetricFamily) ([]byte
|
||||
}
|
||||
|
||||
if len(labels) > 0 {
|
||||
_, _ = buffer.WriteString(strings.Join(sortedKeys(labels), " "))
|
||||
_, _ = buffer.WriteString(strings.Join(maps.SortedKeys(labels), " "))
|
||||
}
|
||||
|
||||
_, _ = buffer.WriteString(" |\n")
|
||||
@@ -190,12 +191,3 @@ func updatePrometheusDoc(doc []byte, metricFamilies []*dto.MetricFamily) ([]byte
|
||||
func writePrometheusDoc(doc []byte) error {
|
||||
return atomicwrite.File(prometheusDocFile, doc)
|
||||
}
|
||||
|
||||
func sortedKeys(m map[string]struct{}) []string {
|
||||
var keys []string
|
||||
for k := range m {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
sort.Strings(keys)
|
||||
return keys
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import (
|
||||
|
||||
"github.com/coder/coder/v2/coderd/rbac"
|
||||
"github.com/coder/coder/v2/coderd/rbac/policy"
|
||||
utilstrings "github.com/coder/coder/v2/coderd/util/strings"
|
||||
"github.com/coder/coder/v2/codersdk"
|
||||
)
|
||||
|
||||
@@ -131,15 +132,11 @@ func generateCountries() ([]byte, error) {
|
||||
func pascalCaseName[T ~string](name T) string {
|
||||
names := strings.Split(string(name), "_")
|
||||
for i := range names {
|
||||
names[i] = capitalize(names[i])
|
||||
names[i] = utilstrings.Capitalize(names[i])
|
||||
}
|
||||
return strings.Join(names, "")
|
||||
}
|
||||
|
||||
func capitalize(name string) string {
|
||||
return strings.ToUpper(string(name[0])) + name[1:]
|
||||
}
|
||||
|
||||
type Definition struct {
|
||||
policy.PermissionDefinition
|
||||
Type string
|
||||
@@ -226,7 +223,7 @@ func generateRbacObjects(templateSource string) ([]byte, error) {
|
||||
var errorList []error
|
||||
var x int
|
||||
tpl, err := template.New("object.gotmpl").Funcs(template.FuncMap{
|
||||
"capitalize": capitalize,
|
||||
"capitalize": utilstrings.Capitalize,
|
||||
"pascalCaseName": pascalCaseName[string],
|
||||
"actionsList": func() []ActionDetails {
|
||||
return actionList
|
||||
|
||||
Reference in New Issue
Block a user