Skip to content

Commit b5ac3d2

Browse files
committed
fix: support boolean query params in api codegen
1 parent 058e98a commit b5ac3d2

3 files changed

Lines changed: 75 additions & 0 deletions

File tree

api/v4Internal/server.gen.go

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/ox/gen/codegen.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,24 @@ func writeQueryParam(buf *bytes.Buffer, p *Param) {
190190
fmt.Fprintf(buf, "\t\t}\n")
191191
fmt.Fprintf(buf, "\t}\n")
192192
}
193+
case "bool":
194+
if p.Required {
195+
fmt.Fprintf(buf, "\tif v, err := strconv.ParseBool(r.URL.Query().Get(%q)); err != nil {\n", p.Name)
196+
fmt.Fprintf(buf, "\t\truntime.WriteBadRequest(w, %q)\n", "invalid query parameter: "+p.Name)
197+
fmt.Fprintf(buf, "\t\treturn\n")
198+
fmt.Fprintf(buf, "\t} else {\n")
199+
fmt.Fprintf(buf, "\t\treq.%s = v\n", p.GoName)
200+
fmt.Fprintf(buf, "\t}\n")
201+
} else {
202+
fmt.Fprintf(buf, "\tif qs := r.URL.Query().Get(%q); qs != \"\" {\n", p.Name)
203+
fmt.Fprintf(buf, "\t\tif v, err := strconv.ParseBool(qs); err != nil {\n")
204+
fmt.Fprintf(buf, "\t\t\truntime.WriteBadRequest(w, %q)\n", "invalid query parameter: "+p.Name)
205+
fmt.Fprintf(buf, "\t\t\treturn\n")
206+
fmt.Fprintf(buf, "\t\t} else {\n")
207+
fmt.Fprintf(buf, "\t\t\treq.%s = v\n", p.GoName)
208+
fmt.Fprintf(buf, "\t\t}\n")
209+
fmt.Fprintf(buf, "\t}\n")
210+
}
193211
}
194212
}
195213

pkg/ox/gen/codegen_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,3 +407,48 @@ func TestGenerateServer_BaseURLPlacement(t *testing.T) {
407407
require.NotContains(t, src, `params.BaseURL+"GET `, "BaseURL should not come before HTTP method")
408408
require.NotContains(t, src, `params.BaseURL+"POST `, "BaseURL should not come before HTTP method")
409409
}
410+
411+
func TestGenerateServer_BooleanQueryParams(t *testing.T) {
412+
api := &API{
413+
PackageName: "v4",
414+
StructName: "Server",
415+
ModulePath: "github.com/example/app",
416+
Endpoints: []Endpoint{
417+
{
418+
Name: "SearchItems",
419+
Method: "GET",
420+
Path: "/items",
421+
RequestType: "SearchItemsRequest",
422+
Params: []Param{
423+
{Name: "active", GoName: "Active", GoType: "bool", Location: "query", Required: true},
424+
{Name: "verified", GoName: "Verified", GoType: "bool", Location: "query", Required: false},
425+
},
426+
Response: Response{StatusCode: 200, GoType: "[]Item"},
427+
},
428+
},
429+
}
430+
431+
code, err := GenerateServer(api)
432+
require.NoError(t, err)
433+
434+
src := string(code)
435+
436+
// Verify it parses as valid Go
437+
fset := token.NewFileSet()
438+
_, err = parser.ParseFile(fset, "server.gen.go", src, 0)
439+
require.NoError(t, err, "generated code should be valid Go")
440+
441+
// Check required boolean parameter handling
442+
require.Contains(t, src, `strconv.ParseBool(r.URL.Query().Get("active"))`)
443+
require.Contains(t, src, `req.Active = v`)
444+
require.Contains(t, src, `runtime.WriteBadRequest(w, "invalid query parameter: active")`)
445+
446+
// Check optional boolean parameter handling
447+
require.Contains(t, src, `if qs := r.URL.Query().Get("verified"); qs != ""`)
448+
require.Contains(t, src, `strconv.ParseBool(qs)`)
449+
require.Contains(t, src, `req.Verified = v`)
450+
require.Contains(t, src, `runtime.WriteBadRequest(w, "invalid query parameter: verified")`)
451+
452+
// strconv should be imported for bool params
453+
require.Contains(t, src, `"strconv"`)
454+
}

0 commit comments

Comments
 (0)