Skip to content

Commit 7044dbd

Browse files
bilby91claude
andcommitted
Fix all golangci-lint issues
- Fix var-naming: rename userIdParam/userIdFlag to userIDParam/userIDFlag - Fix rangeValCopy: use index-based access with pointers in range loops - Fix ifElseChain: convert if-else to switch statement in naming.go - Fix appendAssign: properly initialize slice before appending in load.go - Fix gofmt/goimports formatting issues - Fix staticcheck SA4017: add hasAnyPrefix helper for prefix checks in sse.go - Update .golangci.yml: replace deprecated exportloopref with copyloopvar Co-Authored-By: Claude Opus 4.5 <[email protected]>
1 parent 6775729 commit 7044dbd

File tree

11 files changed

+77
-47
lines changed

11 files changed

+77
-47
lines changed

.golangci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ linters:
1818
- unconvert
1919
- bodyclose
2020
- nilerr
21-
- exportloopref
21+
- copyloopvar
2222
- gocritic
2323
- revive
2424

cmd/opencligen/main.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ import (
77
"os/exec"
88
"path/filepath"
99

10+
"github.com/spf13/cobra"
11+
1012
"github.com/crunchloop/opencligen/internal/gen"
1113
"github.com/crunchloop/opencligen/internal/plan"
1214
"github.com/crunchloop/opencligen/internal/spec"
13-
"github.com/spf13/cobra"
1415
)
1516

1617
// Version information set by ldflags during build
@@ -155,9 +156,11 @@ func printPlan(p *plan.Plan) {
155156
fmt.Printf("\n=== Command Plan for %s ===\n\n", p.AppName)
156157
fmt.Printf("Module: %s\n\n", p.ModuleName)
157158

158-
for _, group := range p.Groups {
159+
for gi := range p.Groups {
160+
group := &p.Groups[gi]
159161
fmt.Printf("Group: %s\n", group.Name)
160-
for _, op := range group.Operations {
162+
for oi := range group.Operations {
163+
op := &group.Operations[oi]
161164
cmdPath := ""
162165
for i, part := range op.CommandPath {
163166
if i > 0 {
@@ -167,7 +170,8 @@ func printPlan(p *plan.Plan) {
167170
}
168171

169172
flags := ""
170-
for _, f := range op.Flags {
173+
for fi := range op.Flags {
174+
f := &op.Flags[fi]
171175
if flags != "" {
172176
flags += ", "
173177
}
@@ -179,7 +183,8 @@ func printPlan(p *plan.Plan) {
179183
}
180184

181185
positionals := ""
182-
for _, pos := range op.Positionals {
186+
for pi := range op.Positionals {
187+
pos := &op.Positionals[pi]
183188
positionals += fmt.Sprintf(" <%s>", pos.Name)
184189
}
185190

cmd/opencligen/main_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ func createTestCommand() *cobra.Command {
6868

6969
func TestGen_MissingRequiredFlags(t *testing.T) {
7070
tests := []struct {
71-
name string
72-
args []string
73-
wantErrMsg string
71+
name string
72+
args []string
73+
wantErrMsg string
7474
}{
7575
{
7676
name: "missing all flags",

internal/gen/generate.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,9 @@ func (g *Generator) generateCommands() error {
178178
}
179179

180180
// Generate operation files
181-
for _, op := range group.Operations {
182-
if err := g.generateOperation(opTmpl, group, op); err != nil {
181+
for oi := range group.Operations {
182+
op := &group.Operations[oi]
183+
if err := g.generateOperation(opTmpl, group, *op); err != nil {
183184
return fmt.Errorf("failed to generate operation %s: %w", op.OperationID, err)
184185
}
185186
}
@@ -194,7 +195,8 @@ func (g *Generator) generateOperation(tmpl *template.Template, group plan.GroupP
194195

195196
// Build positionals data
196197
positionals := make([]map[string]interface{}, len(op.Positionals))
197-
for i, p := range op.Positionals {
198+
for i := range op.Positionals {
199+
p := &op.Positionals[i]
198200
positionals[i] = map[string]interface{}{
199201
"Name": p.Name,
200202
"VarName": toVarName(p.FlagName),
@@ -203,7 +205,8 @@ func (g *Generator) generateOperation(tmpl *template.Template, group plan.GroupP
203205

204206
// Build flags data
205207
flags := make([]map[string]interface{}, len(op.Flags))
206-
for i, p := range op.Flags {
208+
for i := range op.Flags {
209+
p := &op.Flags[i]
207210
defaultStr := ""
208211
if p.Default != nil {
209212
defaultStr = fmt.Sprintf("%v", p.Default)
@@ -225,14 +228,14 @@ func (g *Generator) generateOperation(tmpl *template.Template, group plan.GroupP
225228

226229
// Build use string with positionals
227230
use := cmdName
228-
for _, p := range op.Positionals {
229-
use += fmt.Sprintf(" <%s>", p.Name)
231+
for i := range op.Positionals {
232+
use += fmt.Sprintf(" <%s>", op.Positionals[i].Name)
230233
}
231234

232235
// Check if any flags are required
233236
hasRequiredFlags := false
234-
for _, p := range op.Flags {
235-
if p.Required {
237+
for i := range op.Flags {
238+
if op.Flags[i].Required {
236239
hasRequiredFlags = true
237240
break
238241
}

internal/gen/runtime/sse.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ func isEventStream(contentType string) bool {
1919
return strings.Contains(contentType, "text/event-stream")
2020
}
2121

22+
// hasAnyPrefix checks if s has any of the given prefixes
23+
func hasAnyPrefix(s string, prefixes ...string) bool {
24+
for _, prefix := range prefixes {
25+
if strings.HasPrefix(s, prefix) {
26+
return true
27+
}
28+
}
29+
return false
30+
}
31+
2232
// handleSSE handles Server-Sent Events response
2333
func handleSSE(reader io.Reader, out io.Writer) error {
2434
scanner := bufio.NewScanner(reader)
@@ -69,9 +79,7 @@ func handleSSE(reader io.Reader, out io.Writer) error {
6979
}
7080

7181
// Handle other SSE fields (event, id, retry) - we just skip them for now
72-
if strings.HasPrefix(line, "event:") ||
73-
strings.HasPrefix(line, "id:") ||
74-
strings.HasPrefix(line, "retry:") {
82+
if hasAnyPrefix(line, "event:", "id:", "retry:") {
7583
continue
7684
}
7785
}

internal/plan/builder.go

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@ func Build(s *spec.Spec, appName, moduleName string) *Plan {
1515

1616
// Group operations by tag
1717
groups := make(map[string][]spec.Operation)
18-
for _, op := range s.Operations {
18+
for i := range s.Operations {
19+
op := &s.Operations[i]
1920
tag := op.Tag
2021
if tag == "" {
2122
tag = "default"
2223
}
23-
groups[tag] = append(groups[tag], op)
24+
groups[tag] = append(groups[tag], *op)
2425
}
2526

2627
// Sort group names for deterministic output
@@ -45,8 +46,8 @@ func buildGroupPlan(name string, ops []spec.Operation) GroupPlan {
4546
Name: DeriveGroupName(name),
4647
}
4748

48-
for _, op := range ops {
49-
opPlan := buildOpPlan(name, op)
49+
for i := range ops {
50+
opPlan := buildOpPlan(name, ops[i])
5051
group.Operations = append(group.Operations, opPlan)
5152
}
5253

@@ -88,17 +89,19 @@ func buildOpPlan(groupName string, op spec.Operation) OpPlan {
8889
var pathParams []spec.Param
8990
var otherParams []spec.Param
9091

91-
for _, p := range op.Params {
92+
for i := range op.Params {
93+
p := &op.Params[i]
9294
if p.In == "path" {
93-
pathParams = append(pathParams, p)
95+
pathParams = append(pathParams, *p)
9496
} else {
95-
otherParams = append(otherParams, p)
97+
otherParams = append(otherParams, *p)
9698
}
9799
}
98100

99101
// Path params become positionals by default (in path order)
100-
for _, p := range pathParams {
101-
paramPlan := buildParamPlan(p)
102+
for i := range pathParams {
103+
p := &pathParams[i]
104+
paramPlan := buildParamPlan(*p)
102105

103106
// Check if explicitly marked as non-positional
104107
isPositional := true
@@ -114,8 +117,8 @@ func buildOpPlan(groupName string, op spec.Operation) OpPlan {
114117
}
115118

116119
// Other params become flags
117-
for _, p := range otherParams {
118-
paramPlan := buildParamPlan(p)
120+
for i := range otherParams {
121+
paramPlan := buildParamPlan(otherParams[i])
119122
opPlan.Flags = append(opPlan.Flags, paramPlan)
120123
}
121124

internal/plan/naming.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@ func toKebabCase(s string) string {
6464

6565
var result strings.Builder
6666
for i, r := range s {
67-
if unicode.IsUpper(r) {
67+
switch {
68+
case unicode.IsUpper(r):
6869
if i > 0 {
6970
// Don't add hyphen if previous char was already uppercase (e.g., "ID" -> "id")
7071
prev := rune(s[i-1])
@@ -73,9 +74,9 @@ func toKebabCase(s string) string {
7374
}
7475
}
7576
result.WriteRune(unicode.ToLower(r))
76-
} else if r == '_' || r == ' ' {
77+
case r == '_' || r == ' ':
7778
result.WriteRune('-')
78-
} else {
79+
default:
7980
result.WriteRune(r)
8081
}
8182
}

internal/plan/plan_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,15 @@ func TestBuild_TasksCreateHasUserIdAndDataFlags(t *testing.T) {
138138
}
139139

140140
// Check for --user-id flag (X-User-Id header)
141-
var userIdFlag *ParamPlan
141+
var userIDFlag *ParamPlan
142142
for i := range createOp.Flags {
143143
if createOp.Flags[i].FlagName == "user-id" {
144-
userIdFlag = &createOp.Flags[i]
144+
userIDFlag = &createOp.Flags[i]
145145
break
146146
}
147147
}
148148

149-
if userIdFlag == nil {
149+
if userIDFlag == nil {
150150
t.Error("expected --user-id flag (from X-User-Id header)")
151151
}
152152

internal/runtime_skel/sse.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,16 @@ func isEventStream(contentType string) bool {
1919
return strings.Contains(contentType, "text/event-stream")
2020
}
2121

22+
// hasAnyPrefix checks if s has any of the given prefixes
23+
func hasAnyPrefix(s string, prefixes ...string) bool {
24+
for _, prefix := range prefixes {
25+
if strings.HasPrefix(s, prefix) {
26+
return true
27+
}
28+
}
29+
return false
30+
}
31+
2232
// handleSSE handles Server-Sent Events response
2333
func handleSSE(reader io.Reader, out io.Writer) error {
2434
scanner := bufio.NewScanner(reader)
@@ -69,9 +79,7 @@ func handleSSE(reader io.Reader, out io.Writer) error {
6979
}
7080

7181
// Handle other SSE fields (event, id, retry) - we just skip them for now
72-
if strings.HasPrefix(line, "event:") ||
73-
strings.HasPrefix(line, "id:") ||
74-
strings.HasPrefix(line, "retry:") {
82+
if hasAnyPrefix(line, "event:", "id:", "retry:") {
7583
continue
7684
}
7785
}

internal/spec/load.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ func extractOperation(path, method string, op *openapi3.Operation, pathParams op
122122
}
123123

124124
// Extract parameters (path-level + operation-level)
125-
allParams := append(pathParams, op.Parameters...)
125+
allParams := make([]*openapi3.ParameterRef, 0, len(pathParams)+len(op.Parameters))
126+
allParams = append(allParams, pathParams...)
127+
allParams = append(allParams, op.Parameters...)
126128
for _, paramRef := range allParams {
127129
if paramRef == nil || paramRef.Value == nil {
128130
continue

0 commit comments

Comments
 (0)