Skip to content

Commit

Permalink
[protoc-gen-openapi] Support google.protobuf.Any and google.rpc.Status (
Browse files Browse the repository at this point in the history
#327)

* support google.rpc.Status and google.protobuf.Any. Also fix the fully qualified naming of google.protobuf.Value

* updated the non-fully-qualified names for Value and Any types, modified their descriptions, and added nullable to Value

* add restriction on the object type for value messages.

* make GoogleProtobufValue typeless which accomplishes what we want with less code
  • Loading branch information
jeffsawatzky authored Apr 2, 2022
1 parent ec4d35c commit e954645
Show file tree
Hide file tree
Showing 12 changed files with 360 additions and 122 deletions.
47 changes: 47 additions & 0 deletions cmd/protoc-gen-openapi/examples/google/rpc/status.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.rpc;

import "google/protobuf/any.proto";

option cc_enable_arenas = true;
option go_package = "google.golang.org/genproto/googleapis/rpc/status;status";
option java_multiple_files = true;
option java_outer_classname = "StatusProto";
option java_package = "com.google.rpc";
option objc_class_prefix = "RPC";

// The `Status` type defines a logical error model that is suitable for
// different programming environments, including REST APIs and RPC APIs. It is
// used by [gRPC](https://github.com/grpc). Each `Status` message contains
// three pieces of data: error code, error message, and error details.
//
// You can find out more about this error model and how to work with it in the
// [API Design Guide](https://cloud.google.com/apis/design/errors).
message Status {
// The status code, which should be an enum value of [google.rpc.Code][google.rpc.Code].
int32 code = 1;

// A developer-facing error message, which should be in English. Any
// user-facing error message should be localized and sent in the
// [google.rpc.Status.details][google.rpc.Status.details] field, or localized by the client.
string message = 2;

// A list of messages that carry the error details. There is a common set of
// message types for APIs to use.
repeated google.protobuf.Any details = 3;
}
27 changes: 9 additions & 18 deletions cmd/protoc-gen-openapi/examples/tests/protobuftypes/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
/v1/messages/{message_id}:
get:
tags:
Expand Down Expand Up @@ -84,14 +84,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
- name: repeated_value_type
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
responses:
"200":
description: OK
Expand Down Expand Up @@ -185,14 +185,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
- name: repeated_value_type
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
requestBody:
content:
application/json:
Expand Down Expand Up @@ -236,17 +236,8 @@ paths:
'*/*': {}
components:
schemas:
AnyJSONValue:
oneOf:
- type: string
- type: number
- type: integer
- type: boolean
- type: object
- type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
description: AnyJSONValue is a "catch all" type that can hold any JSON value, except null as this is not allowed in OpenAPI
GoogleProtobufValue:
description: Represents a dynamically typed value which can be either null, a number, a string, a boolean, a recursive struct value, or a list of values.
Message:
type: object
properties:
Expand Down Expand Up @@ -283,11 +274,11 @@ components:
items:
type: object
value_type:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
repeated_value_type:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
description: Description of repeated value
Message_EmbMessage:
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
/v1/messages/{messageId}:
get:
tags:
Expand Down Expand Up @@ -84,14 +84,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
- name: repeatedValueType
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
responses:
"200":
description: OK
Expand Down Expand Up @@ -185,14 +185,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
- name: repeatedValueType
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
requestBody:
content:
application/json:
Expand Down Expand Up @@ -236,17 +236,8 @@ paths:
'*/*': {}
components:
schemas:
AnyJSONValue:
oneOf:
- type: string
- type: number
- type: integer
- type: boolean
- type: object
- type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
description: AnyJSONValue is a "catch all" type that can hold any JSON value, except null as this is not allowed in OpenAPI
google.protobuf.Value:
description: Represents a dynamically typed value which can be either null, a number, a string, a boolean, a recursive struct value, or a list of values.
tests.protobuftypes.message.v1.Message:
type: object
properties:
Expand Down Expand Up @@ -283,11 +274,11 @@ components:
items:
type: object
valueType:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
repeatedValueType:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/google.protobuf.Value'
description: Description of repeated value
tests.protobuftypes.message.v1.Message_EmbMessage:
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
/v1/messages/{messageId}:
get:
tags:
Expand Down Expand Up @@ -84,14 +84,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
- name: repeatedValueType
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
responses:
"200":
description: OK
Expand Down Expand Up @@ -185,14 +185,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
- name: repeatedValueType
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
requestBody:
content:
application/json:
Expand Down Expand Up @@ -236,17 +236,8 @@ paths:
'*/*': {}
components:
schemas:
AnyJSONValue:
oneOf:
- type: string
- type: number
- type: integer
- type: boolean
- type: object
- type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
description: AnyJSONValue is a "catch all" type that can hold any JSON value, except null as this is not allowed in OpenAPI
GoogleProtobufValue:
description: Represents a dynamically typed value which can be either null, a number, a string, a boolean, a recursive struct value, or a list of values.
Message:
type: object
properties:
Expand Down Expand Up @@ -283,11 +274,11 @@ components:
items:
type: object
valueType:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
repeatedValueType:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
description: Description of repeated value
Message_EmbMessage:
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ paths:
content:
application/json:
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
/v1/messages/{messageId}:
get:
tags:
Expand Down Expand Up @@ -84,14 +84,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
- name: repeatedValueType
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
responses:
"200":
description: OK
Expand Down Expand Up @@ -185,14 +185,14 @@ paths:
in: query
description: Description of value
schema:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
- name: repeatedValueType
in: query
description: Description of repeated value
schema:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
requestBody:
content:
application/json:
Expand Down Expand Up @@ -236,17 +236,8 @@ paths:
'*/*': {}
components:
schemas:
AnyJSONValue:
oneOf:
- type: string
- type: number
- type: integer
- type: boolean
- type: object
- type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
description: AnyJSONValue is a "catch all" type that can hold any JSON value, except null as this is not allowed in OpenAPI
GoogleProtobufValue:
description: Represents a dynamically typed value which can be either null, a number, a string, a boolean, a recursive struct value, or a list of values.
Message:
type: object
properties:
Expand Down Expand Up @@ -283,11 +274,11 @@ components:
items:
type: object
valueType:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
repeatedValueType:
type: array
items:
$ref: '#/components/schemas/AnyJSONValue'
$ref: '#/components/schemas/GoogleProtobufValue'
description: Description of repeated value
Message_EmbMessage:
type: object
Expand Down
32 changes: 32 additions & 0 deletions cmd/protoc-gen-openapi/examples/tests/rpctypes/message.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// Copyright 2021 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

syntax = "proto3";

package tests.rpctypes.message.v1;

import "google/protobuf/empty.proto";
import "google/api/annotations.proto";
import "google/rpc/status.proto";

option go_package = "github.com/google/gnostic/apps/protoc-gen-openapi/examples/tests/rpctypes/message/v1;message";

service Status {
rpc GetStatus(google.protobuf.Empty) returns (google.rpc.Status) {
option(google.api.http) = {
get: "/v1/status"
};
}
}
Loading

0 comments on commit e954645

Please sign in to comment.