Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gen-grpc-gateway, gen-openapiv2: add support for proto3 optional #1951

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions examples/internal/clients/abe/api/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,12 @@ paths:
type: "string"
x-exportParamName: "OutputOnlyStringViaFieldBehaviorAnnotation"
x-optionalDataType: "String"
- name: "optionalStringValue"
in: "query"
required: false
type: "string"
x-exportParamName: "OptionalStringValue"
x-optionalDataType: "String"
responses:
200:
description: "A successful response."
Expand Down Expand Up @@ -714,6 +720,12 @@ paths:
type: "string"
x-exportParamName: "OutputOnlyStringViaFieldBehaviorAnnotation"
x-optionalDataType: "String"
- name: "optionalStringValue"
in: "query"
required: false
type: "string"
x-exportParamName: "OptionalStringValue"
x-optionalDataType: "String"
responses:
200:
description: "A successful response."
Expand Down Expand Up @@ -1012,6 +1024,12 @@ paths:
type: "string"
x-exportParamName: "OutputOnlyStringViaFieldBehaviorAnnotation"
x-optionalDataType: "String"
- name: "optionalStringValue"
in: "query"
required: false
type: "string"
x-exportParamName: "OptionalStringValue"
x-optionalDataType: "String"
responses:
200:
description: "A successful response."
Expand Down Expand Up @@ -1330,6 +1348,12 @@ paths:
type: "string"
x-exportParamName: "OutputOnlyStringViaFieldBehaviorAnnotation"
x-optionalDataType: "String"
- name: "optionalStringValue"
in: "query"
required: false
type: "string"
x-exportParamName: "OptionalStringValue"
x-optionalDataType: "String"
responses:
200:
description: "A successful response."
Expand Down Expand Up @@ -2698,6 +2722,8 @@ definitions:
type: "string"
title: "mark a field as readonly in Open API definition"
readOnly: true
optionalStringValue:
type: "string"
externalDocs:
description: "Find out more about ABitOfEverything"
url: "https://github.com/grpc-ecosystem/grpc-gateway"
Expand Down
20 changes: 20 additions & 0 deletions examples/internal/clients/abe/api_a_bit_of_everything_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ ABitOfEverythingServiceApiService
* @param "NestedAnnotationOk" (optional.String) - DeepEnum description. - FALSE: FALSE is false. - TRUE: TRUE is true.
* @param "Int64OverrideType" (optional.Int64) -
* @param "OutputOnlyStringViaFieldBehaviorAnnotation" (optional.String) - mark a field as readonly in Open API definition.
* @param "OptionalStringValue" (optional.String) -

@return ExamplepbABitOfEverything
*/
Expand Down Expand Up @@ -259,6 +260,7 @@ type ABitOfEverythingServiceCheckGetQueryParamsOpts struct {
NestedAnnotationOk optional.String
Int64OverrideType optional.Int64
OutputOnlyStringViaFieldBehaviorAnnotation optional.String
OptionalStringValue optional.String
}

func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceCheckGetQueryParams(ctx context.Context, singleNestedName string, floatValue float32, requiredStringViaFieldBehaviorAnnotation string, localVarOptionals *ABitOfEverythingServiceCheckGetQueryParamsOpts) (ExamplepbABitOfEverything, *http.Response, error) {
Expand Down Expand Up @@ -376,6 +378,9 @@ func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceCheckGetQuery
if localVarOptionals != nil && localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.IsSet() {
localVarQueryParams.Add("outputOnlyStringViaFieldBehaviorAnnotation", parameterToString(localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.Value(), ""))
}
if localVarOptionals != nil && localVarOptionals.OptionalStringValue.IsSet() {
localVarQueryParams.Add("optionalStringValue", parameterToString(localVarOptionals.OptionalStringValue.Value(), ""))
}
// to determine the Content-Type header
localVarHttpContentTypes := []string{"application/json", "application/x-foo-mime"}

Expand Down Expand Up @@ -547,6 +552,7 @@ ABitOfEverythingServiceApiService
* @param "NestedAnnotationAmount" (optional.Int64) -
* @param "Int64OverrideType" (optional.Int64) -
* @param "OutputOnlyStringViaFieldBehaviorAnnotation" (optional.String) - mark a field as readonly in Open API definition.
* @param "OptionalStringValue" (optional.String) -

@return ExamplepbABitOfEverything
*/
Expand Down Expand Up @@ -584,6 +590,7 @@ type ABitOfEverythingServiceCheckNestedEnumGetQueryParamsOpts struct {
NestedAnnotationAmount optional.Int64
Int64OverrideType optional.Int64
OutputOnlyStringViaFieldBehaviorAnnotation optional.String
OptionalStringValue optional.String
}

func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceCheckNestedEnumGetQueryParams(ctx context.Context, singleNestedOk string, floatValue float32, requiredStringViaFieldBehaviorAnnotation string, localVarOptionals *ABitOfEverythingServiceCheckNestedEnumGetQueryParamsOpts) (ExamplepbABitOfEverything, *http.Response, error) {
Expand Down Expand Up @@ -701,6 +708,9 @@ func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceCheckNestedEn
if localVarOptionals != nil && localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.IsSet() {
localVarQueryParams.Add("outputOnlyStringViaFieldBehaviorAnnotation", parameterToString(localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.Value(), ""))
}
if localVarOptionals != nil && localVarOptionals.OptionalStringValue.IsSet() {
localVarQueryParams.Add("optionalStringValue", parameterToString(localVarOptionals.OptionalStringValue.Value(), ""))
}
// to determine the Content-Type header
localVarHttpContentTypes := []string{"application/json", "application/x-foo-mime"}

Expand Down Expand Up @@ -871,6 +881,7 @@ ABitOfEverythingServiceApiService
* @param "NestedAnnotationOk" (optional.String) - DeepEnum description. - FALSE: FALSE is false. - TRUE: TRUE is true.
* @param "Int64OverrideType" (optional.Int64) -
* @param "OutputOnlyStringViaFieldBehaviorAnnotation" (optional.String) - mark a field as readonly in Open API definition.
* @param "OptionalStringValue" (optional.String) -

@return ExamplepbABitOfEverything
*/
Expand Down Expand Up @@ -906,6 +917,7 @@ type ABitOfEverythingServiceCheckPostQueryParamsOpts struct {
NestedAnnotationOk optional.String
Int64OverrideType optional.Int64
OutputOnlyStringViaFieldBehaviorAnnotation optional.String
OptionalStringValue optional.String
}

func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceCheckPostQueryParams(ctx context.Context, stringValue string, body ABitOfEverythingNested, floatValue float32, requiredStringViaFieldBehaviorAnnotation string, localVarOptionals *ABitOfEverythingServiceCheckPostQueryParamsOpts) (ExamplepbABitOfEverything, *http.Response, error) {
Expand Down Expand Up @@ -1017,6 +1029,9 @@ func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceCheckPostQuer
if localVarOptionals != nil && localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.IsSet() {
localVarQueryParams.Add("outputOnlyStringViaFieldBehaviorAnnotation", parameterToString(localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.Value(), ""))
}
if localVarOptionals != nil && localVarOptionals.OptionalStringValue.IsSet() {
localVarQueryParams.Add("optionalStringValue", parameterToString(localVarOptionals.OptionalStringValue.Value(), ""))
}
// to determine the Content-Type header
localVarHttpContentTypes := []string{"application/json", "application/x-foo-mime"}

Expand Down Expand Up @@ -2492,6 +2507,7 @@ ABitOfEverythingServiceApiService
* @param "NestedAnnotationOk" (optional.String) - DeepEnum description. - FALSE: FALSE is false. - TRUE: TRUE is true.
* @param "Int64OverrideType" (optional.Int64) -
* @param "OutputOnlyStringViaFieldBehaviorAnnotation" (optional.String) - mark a field as readonly in Open API definition.
* @param "OptionalStringValue" (optional.String) -

@return interface{}
*/
Expand Down Expand Up @@ -2530,6 +2546,7 @@ type ABitOfEverythingServiceGetQueryOpts struct {
NestedAnnotationOk optional.String
Int64OverrideType optional.Int64
OutputOnlyStringViaFieldBehaviorAnnotation optional.String
OptionalStringValue optional.String
}

func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceGetQuery(ctx context.Context, uuid string, floatValue float32, requiredStringViaFieldBehaviorAnnotation string, localVarOptionals *ABitOfEverythingServiceGetQueryOpts) (interface{}, *http.Response, error) {
Expand Down Expand Up @@ -2650,6 +2667,9 @@ func (a *ABitOfEverythingServiceApiService) ABitOfEverythingServiceGetQuery(ctx
if localVarOptionals != nil && localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.IsSet() {
localVarQueryParams.Add("outputOnlyStringViaFieldBehaviorAnnotation", parameterToString(localVarOptionals.OutputOnlyStringViaFieldBehaviorAnnotation.Value(), ""))
}
if localVarOptionals != nil && localVarOptionals.OptionalStringValue.IsSet() {
localVarQueryParams.Add("optionalStringValue", parameterToString(localVarOptionals.OptionalStringValue.Value(), ""))
}
// to determine the Content-Type header
localVarHttpContentTypes := []string{"application/json", "application/x-foo-mime"}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,5 @@ type ExamplepbABitOfEverything struct {
Int64OverrideType int64 `json:"int64OverrideType,omitempty"`
RequiredStringViaFieldBehaviorAnnotation string `json:"requiredStringViaFieldBehaviorAnnotation"`
OutputOnlyStringViaFieldBehaviorAnnotation string `json:"outputOnlyStringViaFieldBehaviorAnnotation,omitempty"`
OptionalStringValue string `json:"optionalStringValue,omitempty"`
}
27 changes: 17 additions & 10 deletions examples/internal/integration/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,15 +62,13 @@ func TestEchoPatch(t *testing.T) {

sent := examplepb.DynamicMessage{
StructField: &structpb.Struct{Fields: map[string]*structpb.Value{
"struct_key": {Kind: &structpb.Value_StructValue{
StructValue: &structpb.Struct{Fields: map[string]*structpb.Value{
"layered_struct_key": {Kind: &structpb.Value_StringValue{StringValue: "struct_val"}},
}},
}}}},
ValueField: &structpb.Value{Kind: &structpb.Value_StructValue{StructValue:
&structpb.Struct{Fields: map[string]*structpb.Value{
"value_struct_key": {Kind: &structpb.Value_StringValue{StringValue: "value_struct_val"},
}}},
"struct_key": {Kind: &structpb.Value_StructValue{
StructValue: &structpb.Struct{Fields: map[string]*structpb.Value{
"layered_struct_key": {Kind: &structpb.Value_StringValue{StringValue: "struct_val"}},
}},
}}}},
ValueField: &structpb.Value{Kind: &structpb.Value_StructValue{StructValue: &structpb.Struct{Fields: map[string]*structpb.Value{
"value_struct_key": {Kind: &structpb.Value_StringValue{StringValue: "value_struct_val"}}}},
}},
}
payload, err := protojson.MarshalOptions{UseProtoNames: true}.Marshal(&sent)
Expand Down Expand Up @@ -406,6 +404,7 @@ func testABECreate(t *testing.T, port int) {
}

func testABECreateBody(t *testing.T, port int) {
optionalStrVal := "optional-str"
want := &examplepb.ABitOfEverything{
FloatValue: 1.5,
DoubleValue: 2.5,
Expand Down Expand Up @@ -475,6 +474,7 @@ func testABECreateBody(t *testing.T, port int) {
Name: "hoge",
Amount: 10,
},
OptionalStringValue: &optionalStrVal,
}
apiURL := fmt.Sprintf("http://localhost:%d/v1/example/a_bit_of_everything", port)
payload, err := marshaler.Marshal(want)
Expand Down Expand Up @@ -525,6 +525,7 @@ func testABEBulkCreate(t *testing.T, port int) {
for _, val := range []string{
"foo", "bar", "baz", "qux", "quux",
} {
strVal := fmt.Sprintf("strprefix/%s", val)
want := &examplepb.ABitOfEverything{
FloatValue: 1.5,
DoubleValue: 2.5,
Expand All @@ -534,7 +535,7 @@ func testABEBulkCreate(t *testing.T, port int) {
Fixed64Value: 9223372036854775807,
Fixed32Value: 4294967295,
BoolValue: true,
StringValue: fmt.Sprintf("strprefix/%s", val),
StringValue: strVal,
Uint32Value: 4294967295,
Sfixed32Value: 2147483647,
Sfixed64Value: -4611686018427387904,
Expand Down Expand Up @@ -578,6 +579,7 @@ func testABEBulkCreate(t *testing.T, port int) {
Name: "hoge",
Amount: 10,
},
OptionalStringValue: &strVal,
}
out, err := marshaler.Marshal(want)
if err != nil {
Expand Down Expand Up @@ -1837,6 +1839,7 @@ func testRequestQueryParams(t *testing.T, port int) {
formValues.Set("string_value", "hello-world")
formValues.Add("repeated_string_value", "demo1")
formValues.Add("repeated_string_value", "demo2")
formValues.Add("optional_string_value", "optional-val")

testCases := []struct {
name string
Expand Down Expand Up @@ -1900,6 +1903,10 @@ func testRequestQueryParams(t *testing.T, port int) {
BoolValue: true,
StringValue: "hello-world",
RepeatedStringValue: []string{"demo1", "demo2"},
OptionalStringValue: func() *string {
val := formValues.Get("optional_string_value")
return &val
}(),
},
requestContent: strings.NewReader(formValues.Encode()),
},
Expand Down
Loading