diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-02-24 17:36:24 -0500 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-02-24 17:36:24 -0500 |
| commit | 5b8b30a3f221c21d87cf4174aca5e913136f8399 (patch) | |
| tree | 1139cc1678e3d190f3d68ad6bd7863e30b2923ef /cmd | |
| parent | 9338a5b621a7404bbb6390200e3ec4590935cc63 (diff) | |
| download | xesite-5b8b30a3f221c21d87cf4174aca5e913136f8399.tar.xz xesite-5b8b30a3f221c21d87cf4174aca5e913136f8399.zip | |
cmd/twirp-openapi-gen: fix empty schema
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/twirp-openapi-gen/internal/generator/aliases.go | 3 | ||||
| -rw-r--r-- | cmd/twirp-openapi-gen/internal/generator/handlers.go | 69 |
2 files changed, 43 insertions, 29 deletions
diff --git a/cmd/twirp-openapi-gen/internal/generator/aliases.go b/cmd/twirp-openapi-gen/internal/generator/aliases.go index a8e29f3..660d345 100644 --- a/cmd/twirp-openapi-gen/internal/generator/aliases.go +++ b/cmd/twirp-openapi-gen/internal/generator/aliases.go @@ -74,9 +74,6 @@ var typeAliases = map[string]struct { Type: "boolean", Format: "boolean", }, - "google.protobuf.Empty": { - Type: "object", - }, "google.type.DateTime": { Type: "string", diff --git a/cmd/twirp-openapi-gen/internal/generator/handlers.go b/cmd/twirp-openapi-gen/internal/generator/handlers.go index c11eb46..219000f 100644 --- a/cmd/twirp-openapi-gen/internal/generator/handlers.go +++ b/cmd/twirp-openapi-gen/internal/generator/handlers.go @@ -18,6 +18,7 @@ const ( googleListValueType = "google.protobuf.ListValue" googleStructType = "google.protobuf.Struct" googleValueType = "google.protobuf.Value" + googleEmptyType = "google.protobuf.Empty" googleMoneyType = "google.type.Money" ) @@ -92,40 +93,41 @@ func (gen *generator) RPC(rpc *proto.RPC) { var reqMediaType *openapi3.MediaType switch rpc.RequestType { case "google.protobuf.Empty": - reqMediaType = openapi3.NewMediaType() + gen.addGoogleEmptySchema() default: - if strings.Contains(rpc.RequestType, ".") { - reqMediaType = &openapi3.MediaType{ - Schema: &openapi3.SchemaRef{ - Ref: fmt.Sprintf("#/components/schemas/%s", rpc.RequestType), - }, - } - } else { - reqMediaType = &openapi3.MediaType{ - Schema: &openapi3.SchemaRef{ - Ref: fmt.Sprintf("#/components/schemas/%s.%s", gen.packageName, rpc.RequestType), - }, - } + } + if strings.Contains(rpc.RequestType, ".") { + reqMediaType = &openapi3.MediaType{ + Schema: &openapi3.SchemaRef{ + Ref: fmt.Sprintf("#/components/schemas/%s", rpc.RequestType), + }, + } + } else { + reqMediaType = &openapi3.MediaType{ + Schema: &openapi3.SchemaRef{ + Ref: fmt.Sprintf("#/components/schemas/%s.%s", gen.packageName, rpc.RequestType), + }, } } var resMediaType *openapi3.MediaType switch rpc.ReturnsType { case "google.protobuf.Empty": - resMediaType = openapi3.NewMediaType() + gen.addGoogleEmptySchema() default: - if strings.Contains(rpc.ReturnsType, ".") { - resMediaType = &openapi3.MediaType{ - Schema: &openapi3.SchemaRef{ - Ref: fmt.Sprintf("#/components/schemas/%s", rpc.ReturnsType), - }, - } - } else { - resMediaType = &openapi3.MediaType{ - Schema: &openapi3.SchemaRef{ - Ref: fmt.Sprintf("#/components/schemas/%s.%s", gen.packageName, rpc.ReturnsType), - }, - } + } + + if strings.Contains(rpc.ReturnsType, ".") { + resMediaType = &openapi3.MediaType{ + Schema: &openapi3.SchemaRef{ + Ref: fmt.Sprintf("#/components/schemas/%s", rpc.ReturnsType), + }, + } + } else { + resMediaType = &openapi3.MediaType{ + Schema: &openapi3.SchemaRef{ + Ref: fmt.Sprintf("#/components/schemas/%s.%s", gen.packageName, rpc.ReturnsType), + }, } } @@ -283,6 +285,9 @@ func (gen *generator) addField(schemaPropsV3 openapi3.Schemas, field *proto.Fiel case googleMoneyType: slog.Debug("Money", "name", fieldName, "type", fieldType, "format", fieldFormat) gen.addGoogleMoneySchema() + case googleEmptyType: + slog.Debug("Empty", "name", fieldName, "type", fieldType, "format", fieldFormat) + gen.addGoogleEmptySchema() default: slog.Debug("Default", "name", fieldName, "type", fieldType, "format", fieldFormat) } @@ -318,6 +323,18 @@ func (gen *generator) addField(schemaPropsV3 openapi3.Schemas, field *proto.Fiel } } +func (gen *generator) addGoogleEmptySchema() { + if _, ok := gen.openAPIV3.Components.Schemas[googleEmptyType]; ok { + return + } + gen.openAPIV3.Components.Schemas[googleEmptyType] = &openapi3.SchemaRef{ + Value: &openapi3.Schema{ + Description: "A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance:", + Type: "object", + }, + } +} + // addGoogleAnySchema adds a schema item for the google.protobuf.Any type. func (gen *generator) addGoogleAnySchema() { if _, ok := gen.openAPIV3.Components.Schemas[googleAnyType]; ok { |
