@@ -15,49 +15,55 @@ import (
15
15
type fileGenerator struct {
16
16
* generator
17
17
18
- doc * openapi3.T
18
+ spec * openapi3.T
19
19
}
20
20
21
- func (fg * fileGenerator ) generateFileDoc (file * descriptor.File ) * openapi3.T {
21
+ func (fg * fileGenerator ) generateFileSpec (file * descriptor.File ) * openapi3.T {
22
22
23
- fg .doc = convertFileOptions (file )
23
+ fg .spec = convertFileOptions (file )
24
24
25
- fg .doc .Components = & openapi3.Components {}
26
- fg .doc .Components .Schemas = make (openapi3.Schemas )
27
- fg .doc .Components .RequestBodies = make (openapi3.RequestBodies )
25
+ fg .spec .Components = & openapi3.Components {}
26
+ fg .spec .Components .Schemas = make (openapi3.Schemas )
27
+ fg .spec .Components .RequestBodies = make (openapi3.RequestBodies )
28
28
29
- if fg .doc .Paths == nil {
30
- fg .doc .Paths = & openapi3.Paths {}
29
+ if fg .spec .Paths == nil {
30
+ fg .spec .Paths = & openapi3.Paths {}
31
31
}
32
32
33
33
for _ , svc := range file .Services {
34
- err := fg .generateServiceDoc (svc )
35
- if err != nil {
36
- grpclog .Errorf ("could not generate service document: %v" , err )
34
+ if fg .IsServiceVisible (svc ) {
35
+ err := fg .generateServiceSpec (svc )
36
+ if err != nil {
37
+ grpclog .Errorf ("could not generate service document: %v" , err )
38
+ }
37
39
}
38
40
}
39
41
40
42
for _ , msg := range file .Messages {
41
- fg .getMessageSchemaRef (msg )
43
+ if fg .IsMessageVisible (msg ) {
44
+ fg .generateMessageSchemaRef (msg )
45
+ }
42
46
}
43
47
44
48
for _ , enum := range file .Enums {
45
- fg .getEnumSchema (enum )
49
+ if fg .IsEnumVisible (enum ) {
50
+ fg .generateEnumSchemaRef (enum )
51
+ }
46
52
}
47
53
48
- return fg .doc
54
+ return fg .spec
49
55
}
50
56
51
- func (fg * fileGenerator ) getMessageSchemaRef (msg * descriptor.Message ) * openapi3.SchemaRef {
57
+ func (fg * fileGenerator ) generateMessageSchemaRef (msg * descriptor.Message ) * openapi3.SchemaRef {
52
58
name := fg .resolveName (msg .FQMN ())
53
59
resultRef := openapi3 .NewSchemaRef (fmt .Sprintf ("#/components/schemas/%s" , name ), nil )
54
60
55
- _ , ok := fg .doc .Components .Schemas [name ]
61
+ _ , ok := fg .spec .Components .Schemas [name ]
56
62
if ok {
57
63
return resultRef
58
64
}
59
65
60
- fg .doc .Components .Schemas [name ] = fg .generateMessageSchema (msg , nil ).NewRef ()
66
+ fg .spec .Components .Schemas [name ] = fg .generateMessageSchema (msg , nil ).NewRef ()
61
67
62
68
return resultRef
63
69
}
@@ -110,7 +116,7 @@ func (fg *fileGenerator) generateMessageSchema(msg *descriptor.Message, excludeF
110
116
switch fg .reg .GetOneOfStrategy () {
111
117
case "oneOf" :
112
118
return & openapi3.Schema {
113
- OneOf : fg .generateMessageWithOneOfsSchemas (allOneOfsProperties , properties , msg .GetOneofDecl ()),
119
+ OneOf : fg .generateMessageWithOneOfsSchemas (allOneOfsProperties , properties , msg .GetOneofDecl (), "" ),
114
120
}
115
121
default :
116
122
grpclog .Fatal ("unknown oneof strategy" )
@@ -139,7 +145,7 @@ e.g.: if you have a proto like this:
139
145
2 * 2 = 4, object schemas will be generate for each combination of set {field_one, field_two} and {field_three, field_four}
140
146
*/
141
147
func (fg * fileGenerator ) generateMessageWithOneOfsSchemas (allOneOfsProperties map [int32 ]openapi3.Schemas , properties openapi3.Schemas ,
142
- oneOfs []* descriptorpb.OneofDescriptorProto ) openapi3.SchemaRefs {
148
+ oneOfs []* descriptorpb.OneofDescriptorProto , namePrefix string ) openapi3.SchemaRefs {
143
149
if len (oneOfs ) == 0 {
144
150
return openapi3.SchemaRefs {& openapi3.SchemaRef {
145
151
Value : & openapi3.Schema {
@@ -162,7 +168,7 @@ func (fg *fileGenerator) generateMessageWithOneOfsSchemas(allOneOfsProperties ma
162
168
for fieldName , fieldSchema := range oneOfProperties {
163
169
newProperties := maps .Clone (properties )
164
170
newProperties [fieldName ] = fieldSchema
165
- res = append (res , fg .generateMessageWithOneOfsSchemas (newAllOneOfsProperties , newProperties , newOneOfs )... )
171
+ res = append (res , fg .generateMessageWithOneOfsSchemas (newAllOneOfsProperties , newProperties , newOneOfs , namePrefix + fieldName )... )
166
172
}
167
173
168
174
return res
@@ -205,7 +211,7 @@ func (fg *fileGenerator) generateFieldTypeSchema(fd *descriptorpb.FieldDescripto
205
211
switch ft := fd .GetType (); ft {
206
212
case descriptorpb .FieldDescriptorProto_TYPE_ENUM , descriptorpb .FieldDescriptorProto_TYPE_MESSAGE , descriptorpb .FieldDescriptorProto_TYPE_GROUP :
207
213
openAPIRef := fg .resolveType (fd .GetTypeName ())
208
- if schema , ok := fg .doc .Components .Schemas [openAPIRef ]; ok {
214
+ if schema , ok := fg .spec .Components .Schemas [openAPIRef ]; ok {
209
215
return schema
210
216
} else {
211
217
if fd .GetType () == descriptorpb .FieldDescriptorProto_TYPE_ENUM {
@@ -214,13 +220,13 @@ func (fg *fileGenerator) generateFieldTypeSchema(fd *descriptorpb.FieldDescripto
214
220
panic (err )
215
221
}
216
222
217
- return fg .getEnumSchema (fieldTypeEnum )
223
+ return fg .generateEnumSchemaRef (fieldTypeEnum )
218
224
} else {
219
225
fieldTypeMsg , err := fg .reg .LookupMsg (location , fd .GetTypeName ())
220
226
if err != nil {
221
227
panic (err )
222
228
}
223
- return fg .getMessageSchemaRef (fieldTypeMsg )
229
+ return fg .generateMessageSchemaRef (fieldTypeMsg )
224
230
}
225
231
}
226
232
default :
@@ -230,16 +236,16 @@ func (fg *fileGenerator) generateFieldTypeSchema(fd *descriptorpb.FieldDescripto
230
236
}
231
237
}
232
238
233
- func (fg * fileGenerator ) getEnumSchema (enum * descriptor.Enum ) * openapi3.SchemaRef {
239
+ func (fg * fileGenerator ) generateEnumSchemaRef (enum * descriptor.Enum ) * openapi3.SchemaRef {
234
240
name := fg .resolveName (enum .FQEN ())
235
241
236
- schemaRef , ok := fg .doc .Components .Schemas [name ]
242
+ schemaRef , ok := fg .spec .Components .Schemas [name ]
237
243
if ok {
238
244
return schemaRef
239
245
}
240
246
241
247
schemaRef = fg .generateEnumSchema (enum ).NewRef ()
242
- fg .doc .Components .Schemas [name ] = schemaRef
248
+ fg .spec .Components .Schemas [name ] = schemaRef
243
249
244
250
return schemaRef
245
251
}
@@ -256,11 +262,13 @@ func (fg *fileGenerator) generateEnumSchema(enum *descriptor.Enum) *openapi3.Sch
256
262
}
257
263
}
258
264
259
- func (fg * fileGenerator ) generateServiceDoc (svc * descriptor.Service ) error {
265
+ func (fg * fileGenerator ) generateServiceSpec (svc * descriptor.Service ) error {
260
266
for _ , meth := range svc .Methods {
261
- err := fg .generateMethodDoc (meth )
262
- if err != nil {
263
- return fmt .Errorf ("could not generate method %s doc: %w" , meth .GetName (), err )
267
+ if fg .generator .IsMethodVisible (meth ) {
268
+ err := fg .generateMethodDoc (meth )
269
+ if err != nil {
270
+ return fmt .Errorf ("could not generate method %s doc: %w" , meth .GetName (), err )
271
+ }
264
272
}
265
273
}
266
274
@@ -300,13 +308,13 @@ func (fg *fileGenerator) generateMethodDoc(meth *descriptor.Method) error {
300
308
name := fg .resolveName (meth .RequestType .FQMN ())
301
309
resultRef := fmt .Sprintf ("#/components/requestBodies/%s" , name )
302
310
303
- fg .doc .Components .RequestBodies [name ] = & openapi3.RequestBodyRef {Value : openapi3 .NewRequestBody ().WithContent (
311
+ fg .spec .Components .RequestBodies [name ] = & openapi3.RequestBodyRef {Value : openapi3 .NewRequestBody ().WithContent (
304
312
openapi3 .NewContentWithJSONSchemaRef (messageSchema .NewRef ()))}
305
313
306
314
requestBody = & openapi3.RequestBodyRef {Ref : resultRef }
307
315
} else {
308
316
requestBody = & openapi3.RequestBodyRef {Value : openapi3 .NewRequestBody ().
309
- WithJSONSchemaRef (fg .getMessageSchemaRef (meth .RequestType ))}
317
+ WithJSONSchemaRef (fg .generateMessageSchemaRef (meth .RequestType ))}
310
318
}
311
319
}
312
320
}
@@ -317,10 +325,10 @@ func (fg *fileGenerator) generateMethodDoc(meth *descriptor.Method) error {
317
325
}
318
326
319
327
successResponseSchema := openapi3 .NewResponse ().
320
- WithJSONSchemaRef (fg .getMessageSchemaRef (meth .ResponseType ))
328
+ WithJSONSchemaRef (fg .generateMessageSchemaRef (meth .ResponseType ))
321
329
322
330
defaultResponseSchema := openapi3 .NewResponse ().
323
- WithJSONSchemaRef (fg .getMessageSchemaRef (defaultResponse ))
331
+ WithJSONSchemaRef (fg .generateMessageSchemaRef (defaultResponse ))
324
332
325
333
responses := openapi3 .NewResponses (openapi3 .WithStatus (200 , & openapi3.ResponseRef {Value : successResponseSchema }),
326
334
openapi3 .WithName ("default" , defaultResponseSchema ))
@@ -340,10 +348,10 @@ func (fg *fileGenerator) generateMethodDoc(meth *descriptor.Method) error {
340
348
}
341
349
342
350
path := fg .convertPathTemplate (binding .PathTmpl .Template )
343
- pathItem := fg .doc .Paths .Find (path )
351
+ pathItem := fg .spec .Paths .Find (path )
344
352
if pathItem == nil {
345
353
pathItem = & openapi3.PathItem {}
346
- fg .doc .Paths .Set (path , pathItem )
354
+ fg .spec .Paths .Set (path , pathItem )
347
355
}
348
356
349
357
switch binding .HTTPMethod {
0 commit comments