Skip to content

Commit 88064b2

Browse files
committed
feat(gen): add x-ogen-name extension for parameter naming
Add support for the x-ogen-name extension on OpenAPI parameters, allowing users to customize Go struct field names independently of the OpenAPI parameter name. This mirrors the existing x-ogen-name functionality for schema types. Changes: - Add XOgenName field to openapi.Parameter struct - Parse x-ogen-name extension in parse_parameter.go with Go identifier validation (must be valid and exported) - Use XOgenName in gen_parameters.go for Go field naming - Add positive and negative test cases - Add integration test with generated code Closes #1593
1 parent da23baf commit 88064b2

24 files changed

+1625
-3
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"openapi": "3.0.3",
3+
"info": {
4+
"title": "Parameter Naming Extensions Test",
5+
"version": "v0.1.0"
6+
},
7+
"paths": {
8+
"/items/{itemid}": {
9+
"get": {
10+
"operationId": "getItem",
11+
"parameters": [
12+
{
13+
"name": "itemid",
14+
"in": "path",
15+
"required": true,
16+
"x-ogen-name": "ItemID",
17+
"schema": {
18+
"type": "string"
19+
}
20+
},
21+
{
22+
"name": "pickuptype",
23+
"in": "query",
24+
"x-ogen-name": "PickupType",
25+
"schema": {
26+
"type": "string"
27+
}
28+
},
29+
{
30+
"name": "x-custom-header",
31+
"in": "header",
32+
"x-ogen-name": "CustomHeader",
33+
"schema": {
34+
"type": "string"
35+
}
36+
}
37+
],
38+
"responses": {
39+
"200": {
40+
"description": "Item info",
41+
"content": {
42+
"application/json": {
43+
"schema": {
44+
"type": "object",
45+
"properties": {
46+
"id": {
47+
"type": "string"
48+
}
49+
}
50+
}
51+
}
52+
}
53+
}
54+
}
55+
}
56+
}
57+
}
58+
}

gen/gen_parameters.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,9 +174,16 @@ func (g *Generator) generateParameter(ctx *genctx, opName string, p *openapi.Par
174174
return nil, errors.Wrapf(err, "%q", p.Name)
175175
}
176176

177-
paramName, err := pascalNonEmpty(p.Name)
178-
if err != nil {
179-
return nil, errors.Wrapf(err, "parameter name: %q", p.Name)
177+
var paramName string
178+
if p.XOgenName != "" {
179+
// Use custom name from x-ogen-name extension.
180+
paramName = p.XOgenName
181+
} else {
182+
var err error
183+
paramName, err = pascalNonEmpty(p.Name)
184+
if err != nil {
185+
return nil, errors.Wrapf(err, "parameter name: %q", p.Name)
186+
}
180187
}
181188

182189
var tag ir.Tag

internal/integration/generate.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ package integration
4040
//
4141
//go:generate go run ../../cmd/ogen -v --clean -target test_enum_naming ../../_testdata/positive/enum_naming.yml
4242
//go:generate go run ../../cmd/ogen -v --clean -target test_naming_extensions ../../_testdata/positive/naming_extensions.json
43+
//go:generate go run ../../cmd/ogen -v --clean -target test_param_naming_extensions ../../_testdata/positive/param_naming_extensions.json
4344
//go:generate go run ../../cmd/ogen -v --clean -target test_type_extension ../../_testdata/positive/type_extension.yml
4445
//go:generate go run ../../cmd/ogen -v --clean -target test_type_extension_name ../../_testdata/positive/type_extension_name.yml
4546
//go:generate go run ../../cmd/ogen -v --clean -target test_time_extension ../../_testdata/positive/time_extension.yml
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package integration
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
8+
api "github.com/ogen-go/ogen/internal/integration/test_param_naming_extensions"
9+
)
10+
11+
func TestParamNamingExtensions(t *testing.T) {
12+
// This test verifies that x-ogen-name extension works for parameters.
13+
// The spec defines parameters with custom Go field names:
14+
// - itemid -> ItemID
15+
// - pickuptype -> PickupType
16+
// - x-custom-header -> CustomHeader
17+
a := require.New(t)
18+
19+
// Create params using the custom field names
20+
params := api.GetItemParams{
21+
ItemID: "test-item-id",
22+
}
23+
24+
// Verify the field types exist with the custom names
25+
a.Equal("test-item-id", params.ItemID)
26+
27+
// Test optional fields
28+
params.PickupType.SetTo("delivery")
29+
a.True(params.PickupType.IsSet())
30+
a.Equal("delivery", params.PickupType.Value)
31+
32+
params.CustomHeader.SetTo("custom-value")
33+
a.True(params.CustomHeader.IsSet())
34+
a.Equal("custom-value", params.CustomHeader.Value)
35+
}

0 commit comments

Comments
 (0)