Skip to content

Commit 6e4b532

Browse files
authored
Merge pull request #147 from ogen-go/fix/nested-item
fix: nested item
2 parents b2dcbd0 + 8b38c00 commit 6e4b532

File tree

4 files changed

+51
-6
lines changed

4 files changed

+51
-6
lines changed

example/message.proto

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ message GetItemsResponse {
3434
ItemType type = 2 [(google.api.field_behavior) = REQUIRED];
3535
string name = 3 [(google.api.field_behavior) = REQUIRED];
3636
google.protobuf.Timestamp created_at = 4 [(google.api.field_behavior) = REQUIRED];
37+
repeated NestedItem nested_item = 5;
3738
}
3839

3940
repeated Item items = 1 [(google.api.field_behavior) = REQUIRED];

example/openapi.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,10 @@ components:
173173
createdAt:
174174
type: string
175175
format: date-time
176+
nestedItem:
177+
type: array
178+
items:
179+
$ref: '#/components/schemas/GetItemsResponse.NestedItem'
176180
required:
177181
- id
178182
- type
@@ -202,6 +206,8 @@ components:
202206
enum:
203207
- ITEM_TYPE_UNSPECIFIED
204208
- ITEM_TYPE_BASIC
209+
NestedEnum:
210+
type: object
205211
NestedEnum.ItemType:
206212
type: string
207213
enum:

internal/gen/generator.go

+35-6
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ func NewGenerator(files []*protogen.File, opts ...GeneratorOption) (*Generator,
7070
}
7171
}
7272
}
73+
}
74+
75+
for _, f := range files {
76+
if !f.Generate {
77+
continue
78+
}
7379

7480
for _, m := range f.Messages {
7581
name := descriptorName(m.Desc)
@@ -93,9 +99,10 @@ func NewGenerator(files []*protogen.File, opts ...GeneratorOption) (*Generator,
9399

94100
// Generator instance.
95101
type Generator struct {
96-
spec *ogen.Spec
97-
indent int
98-
requests map[string]struct{}
102+
spec *ogen.Spec
103+
indent int
104+
requests map[string]struct{}
105+
descriptorNames map[string]struct{}
99106
}
100107

101108
// YAML returns OpenAPI specification bytes.
@@ -121,6 +128,7 @@ func (g *Generator) init() {
121128
g.spec = ogen.NewSpec()
122129
g.spec.Init()
123130
g.requests = make(map[string]struct{})
131+
g.descriptorNames = make(map[string]struct{})
124132
}
125133

126134
func (g *Generator) mkMethod(rule HTTPRule, m *protogen.Method) (string, *ogen.Operation, error) {
@@ -143,7 +151,7 @@ func (g *Generator) mkMethod(rule HTTPRule, m *protogen.Method) (string, *ogen.O
143151

144152
func (g *Generator) mkInput(rule HTTPRule, m *protogen.Method, op *ogen.Operation) (string, error) {
145153
name := descriptorName(m.Input.Desc)
146-
g.requests[name] = struct{}{}
154+
g.setRequest(name)
147155

148156
var (
149157
fields = collectFields(m.Input)
@@ -403,8 +411,29 @@ func (g *Generator) hasSchema(s string) bool {
403411
return ok
404412
}
405413

406-
func (g *Generator) hasRequest(r string) bool {
407-
_, ok := g.requests[r]
414+
func (g *Generator) setRequest(s string) {
415+
if g.hasRequest(s) {
416+
return
417+
}
418+
419+
g.requests[s] = struct{}{}
420+
}
421+
422+
func (g *Generator) hasRequest(s string) bool {
423+
_, ok := g.requests[s]
424+
return ok
425+
}
426+
427+
func (g *Generator) setDescriptorName(s string) {
428+
if g.hasDescriptorName(s) {
429+
return
430+
}
431+
432+
g.descriptorNames[s] = struct{}{}
433+
}
434+
435+
func (g *Generator) hasDescriptorName(s string) bool {
436+
_, ok := g.descriptorNames[s]
408437
return ok
409438
}
410439

internal/gen/schema.go

+9
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ func (g *Generator) mkSchema(msg *protogen.Message) error {
5959
}
6060

6161
if field.Message != nil {
62+
name := descriptorName(field.Desc)
63+
if g.hasDescriptorName(name) {
64+
s.SetRef(descriptorRef(field.Message.Desc))
65+
66+
continue
67+
}
68+
69+
g.setDescriptorName(name)
70+
6271
if err := g.mkSchema(field.Message); err != nil {
6372
return err
6473
}

0 commit comments

Comments
 (0)