Skip to content

Commit 35f36c7

Browse files
committed
fixed errors on output code for go client
1 parent 35c1600 commit 35f36c7

File tree

5 files changed

+73
-56
lines changed

5 files changed

+73
-56
lines changed

src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2173,9 +2173,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
21732173
} else if (param instanceof CookieParameter || "cookie".equalsIgnoreCase(param.getIn())) {
21742174
cookieParams.add(codegenParameter.copy());
21752175
}
2176-
if (!codegenParameter.required) {
2177-
codegenOperation.getVendorExtensions().put(CodegenConstants.HAS_OPTIONAL_PARAMS_EXT_NAME, Boolean.TRUE);
2178-
} else {
2176+
if (codegenParameter.required) {
21792177
requiredParams.add(codegenParameter.copy());
21802178
}
21812179
}
@@ -2222,6 +2220,10 @@ public int compare(CodegenParameter one, CodegenParameter another) {
22222220
boolean hasRequiredParams = codegenOperation.requiredParams.size() > 0;
22232221
codegenOperation.getVendorExtensions().put(CodegenConstants.HAS_REQUIRED_PARAMS_EXT_NAME, hasRequiredParams);
22242222

2223+
boolean hasOptionalParams = codegenOperation.allParams.stream()
2224+
.anyMatch(codegenParameter -> !codegenParameter.required);
2225+
codegenOperation.getVendorExtensions().put(CodegenConstants.HAS_OPTIONAL_PARAMS_EXT_NAME, hasOptionalParams);
2226+
22252227
// set Restful Flag
22262228
codegenOperation.getVendorExtensions().put(CodegenConstants.IS_RESTFUL_SHOW_EXT_NAME, codegenOperation.getIsRestfulShow());
22272229
codegenOperation.getVendorExtensions().put(CodegenConstants.IS_RESTFUL_INDEX_EXT_NAME, codegenOperation.getIsRestfulIndex());

src/main/java/io/swagger/codegen/v3/generators/go/AbstractGoCodegen.java

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.swagger.codegen.v3.CliOption;
44
import io.swagger.codegen.v3.CodegenConfig;
55
import io.swagger.codegen.v3.CodegenConstants;
6+
import io.swagger.codegen.v3.CodegenContent;
67
import io.swagger.codegen.v3.CodegenModel;
78
import io.swagger.codegen.v3.CodegenOperation;
89
import io.swagger.codegen.v3.CodegenParameter;
@@ -325,34 +326,36 @@ public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
325326
boolean addedTimeImport = false;
326327
boolean addedOSImport = false;
327328
for (CodegenOperation operation : operations) {
328-
for (CodegenParameter param : operation.allParams) {
329-
// import "os" if the operation uses files
330-
if (!addedOSImport && param.dataType == "*os.File") {
331-
imports.add(createMapping("import", "os"));
332-
addedOSImport = true;
333-
}
334-
335-
// import "time" if the operation has a required time parameter.
336-
if (param.required) {
337-
if (!addedTimeImport && param.dataType == "time.Time") {
338-
imports.add(createMapping("import", "time"));
339-
addedTimeImport = true;
329+
for (CodegenContent codegenContent : operation.getContents()) {
330+
for (CodegenParameter param : codegenContent.getParameters()) {
331+
// import "os" if the operation uses files
332+
if (!addedOSImport && param.dataType == "*os.File") {
333+
imports.add(createMapping("import", "os"));
334+
addedOSImport = true;
340335
}
341-
}
342336

343-
// import "optionals" package if the parameter is primitive and optional
344-
if (!param.required && getBooleanValue(param, CodegenConstants.IS_PRIMITIVE_TYPE_EXT_NAME)) {
345-
if (!addedOptionalImport) {
346-
imports.add(createMapping("import", "github.com/antihax/optional"));
347-
addedOptionalImport = true;
337+
// import "time" if the operation has a required time parameter.
338+
if (param.required) {
339+
if (!addedTimeImport && param.dataType == "time.Time") {
340+
imports.add(createMapping("import", "time"));
341+
addedTimeImport = true;
342+
}
348343
}
349-
// We need to specially map Time type to the optionals package
350-
if (param.dataType == "time.Time") {
351-
param.vendorExtensions.put("x-optionalDataType", "Time");
352-
continue;
344+
345+
// import "optionals" package if the parameter is primitive and optional
346+
if (!param.required && param.getIsPrimitiveType()) {
347+
if (!addedOptionalImport) {
348+
imports.add(createMapping("import", "github.com/antihax/optional"));
349+
addedOptionalImport = true;
350+
}
351+
// We need to specially map Time type to the optionals package
352+
if (param.dataType == "time.Time") {
353+
param.vendorExtensions.put("x-optionalDataType", "Time");
354+
continue;
355+
}
356+
// Map optional type to dataType
357+
param.vendorExtensions.put("x-optionalDataType", param.dataType.substring(0, 1).toUpperCase() + param.dataType.substring(1));
353358
}
354-
// Map optional type to dataType
355-
param.vendorExtensions.put("x-optionalDataType", param.dataType.substring(0, 1).toUpperCase() + param.dataType.substring(1));
356359
}
357360
}
358361
}

src/main/java/io/swagger/codegen/v3/generators/go/GoClientCodegen.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package io.swagger.codegen.v3.generators.go;
22

33
import io.swagger.codegen.v3.CliOption;
4+
import io.swagger.codegen.v3.CodegenOperation;
45
import io.swagger.codegen.v3.CodegenType;
56
import io.swagger.codegen.v3.SupportingFile;
7+
import io.swagger.v3.oas.models.OpenAPI;
8+
import io.swagger.v3.oas.models.Operation;
9+
import io.swagger.v3.oas.models.media.Schema;
610
import org.apache.commons.lang3.StringUtils;
711

812
import java.io.File;
913
import java.util.Arrays;
14+
import java.util.Map;
1015

1116
public class GoClientCodegen extends AbstractGoCodegen {
1217
protected String packageVersion = "1.0.0";
@@ -20,7 +25,6 @@ public GoClientCodegen() {
2025
this.apiTemplateFiles.put("api.mustache", ".go");
2126
this.modelDocTemplateFiles.put("model_doc.mustache", ".md");
2227
this.apiDocTemplateFiles.put("api_doc.mustache", ".md");
23-
this.embeddedTemplateDir = this.templateDir = "go";
2428
this.hideGenerationTimestamp = Boolean.TRUE;
2529
this.setReservedWordsLowerCase(Arrays.asList("string", "bool", "uint", "uint8", "uint16", "uint32", "uint64", "int", "int8", "int16", "int32", "int64", "float32", "float64", "complex64", "complex128", "rune", "byte", "uintptr", "break", "default", "func", "interface", "select", "case", "defer", "go", "map", "struct", "chan", "else", "goto", "package", "switch", "const", "fallthrough", "if", "range", "type", "continue", "for", "import", "return", "var", "error", "ApiResponse", "nil"));
2630
this.cliOptions.add((new CliOption("packageVersion", "Go package version.")).defaultValue("1.0.0"));
@@ -113,5 +117,13 @@ public String toApiDocFilename(String name) {
113117
public void setPackageVersion(String packageVersion) {
114118
this.packageVersion = packageVersion;
115119
}
120+
121+
public CodegenOperation fromOperation(String path, String httpMethod, Operation operation, Map<String, Schema> schemas, OpenAPI openAPI) {
122+
final CodegenOperation codegenOperation = super.fromOperation(path, httpMethod, operation, schemas, openAPI);
123+
if (codegenOperation.getHasBodyParam() || codegenOperation.bodyParam != null) {
124+
codegenOperation.getFormParams().clear();
125+
}
126+
return codegenOperation;
127+
}
116128
}
117129

src/main/resources/handlebars/go/api.mustache

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,26 @@ var (
2020

2121
type {{classname}}Service service
2222
{{#operation}}
23-
24-
/*
23+
{{#contents}}
24+
{{#@first}}
25+
/*
2526
{{{classname}}}Service{{#summary}} {{.}}{{/summary}}{{#notes}}
2627
{{notes}}{{/notes}}
2728
* @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
28-
{{#allParams}}{{#required}} * @param {{paramName}}{{#description}} {{.}}{{/description}}
29-
{{/required}}{{/allParams}}{{#hasOptionalParams}} * @param optional nil or *{{{classname}}}{{{nickname}}}Opts - Optional Parameters:
30-
{{#allParams}}{{^required}} * @param "{{vendorExtensions.x-exportParamName}}" ({{#isPrimitiveType}}optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}}optional.Interface of {{dataType}}{{/isPrimitiveType}}) - {{#description}} {{.}}{{/description}}
31-
{{/required}}{{/allParams}}{{/hasOptionalParams}}
29+
{{#parameters}}{{#required}} * @param {{paramName}}{{#description}} {{.}}{{/description}}
30+
{{/required}}{{/parameters}}{{#hasOptionalParams}} * @param optional nil or *{{{classname}}}{{{nickname}}}Opts - Optional Parameters:
31+
{{#parameters}}{{^required}} * @param "{{vendorExtensions.x-exportParamName}}" ({{#isPrimitiveType}}optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}}optional.Interface of {{dataType}}{{/isPrimitiveType}}) - {{#description}} {{.}}{{/description}}
32+
{{/required}}{{/parameters}}{{/hasOptionalParams}}
3233
{{#returnType}}@return {{{returnType}}}{{/returnType}}
3334
*/
3435
{{#hasOptionalParams}}
3536

36-
type {{{classname}}}{{{nickname}}}Opts struct { {{#allParams}}{{^required}}
37-
{{#isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.Interface{{/isPrimitiveType}}{{/required}}{{/allParams}}
37+
type {{{classname}}}{{{nickname}}}Opts struct { {{#parameters}}{{^required}}
38+
{{#isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.Interface{{/isPrimitiveType}}{{/required}}{{/parameters}}
3839
}
3940

4041
{{/hasOptionalParams}}
41-
func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}}, {{/hasParams}}{{#allParams}}{{#required}}{{paramName}} {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/required}}{{/allParams}}{{#hasOptionalParams}}localVarOptionals *{{{classname}}}{{{nickname}}}Opts{{/hasOptionalParams}}) ({{#returnType}}{{{returnType}}}, {{/returnType}}*http.Response, error) {
42+
func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}}, {{/hasParams}}{{#parameters}}{{#required}}{{paramName}} {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/required}}{{/parameters}}{{#hasOptionalParams}}localVarOptionals *{{{classname}}}{{{nickname}}}Opts{{/hasOptionalParams}}) ({{#returnType}}{{{returnType}}}, {{/returnType}}*http.Response, error) {
4243
var (
4344
localVarHttpMethod = strings.ToUpper("{{httpMethod}}")
4445
localVarPostBody interface{}
@@ -54,7 +55,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
5455
localVarHeaderParams := make(map[string]string)
5556
localVarQueryParams := url.Values{}
5657
localVarFormParams := url.Values{}
57-
{{#allParams}}
58+
{{#parameters}}
5859
{{#required}}
5960
{{#minItems}}
6061
if len({{paramName}}) < {{minItems}} {
@@ -99,7 +100,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
99100
}
100101
{{/maximum}}
101102
{{/required}}
102-
{{/allParams}}
103+
{{/parameters}}
103104

104105
{{#hasQueryParams}}
105106
{{#queryParams}}
@@ -115,7 +116,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
115116
{{/hasQueryParams}}
116117
// to determine the Content-Type header
117118
{{=<% %>=}}
118-
localVarHttpContentTypes := []string{<%#consumes%>"<%&mediaType%>"<%^-last%>, <%/-last%><%/consumes%>}
119+
localVarHttpContentTypes := []string{<%#consumes%>"<%&mediaType%>"<%^@last%>, <%/@last%><%/consumes%>}
119120
<%={{ }}=%>
120121

121122
// set Content-Type header
@@ -126,7 +127,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
126127

127128
// to determine the Accept header
128129
{{=<% %>=}}
129-
localVarHttpHeaderAccepts := []string{<%#produces%>"<%&mediaType%>"<%^-last%>, <%/-last%><%/produces%>}
130+
localVarHttpHeaderAccepts := []string{<%#produces%>"<%&mediaType%>"<%^@last%>, <%/@last%><%/produces%>}
130131
<%={{ }}=%>
131132

132133
// set Accept header
@@ -189,10 +190,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
189190
{{^required}}
190191
if localVarOptionals != nil && localVarOptionals.{{vendorExtensions.x-exportParamName}}.IsSet() {
191192
{{#isPrimitiveType}}localVarPostBody = &localVarOptionals.{{vendorExtensions.x-exportParamName}}.Value(){{/isPrimitiveType}}
192-
{{^isPrimitiveType}}localVarOptional{{vendorExtensions.x-exportParamName}}, localVarOptional{{vendorExtensions.x-exportParamName}}ok := localVarOptionals.{{vendorExtensions.x-exportParamName}}.Value().({{{dataType}}})
193-
if !localVarOptional{{vendorExtensions.x-exportParamName}}ok {
194-
return {{#returnType}}localVarReturnValue, {{/returnType}}nil, reportError("{{paramName}} should be {{dataType}}")
195-
}
193+
{{^isPrimitiveType}}localVarOptional{{vendorExtensions.x-exportParamName}}:= localVarOptionals.{{vendorExtensions.x-exportParamName}}.Value()
196194
localVarPostBody = &localVarOptional{{vendorExtensions.x-exportParamName}}{{/isPrimitiveType}}
197195
}
198196
{{/required}}
@@ -263,4 +261,4 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
263261

264262
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHttpResponse, nil
265263
}
266-
{{/operation}}{{/operations}}
264+
{{/@first}}{{/contents}}{{/operation}}{{/operations}}

src/main/resources/mustache/go/api.mustache

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,27 @@ var (
2020

2121
type {{classname}}Service service
2222
{{#operation}}
23+
{{#contents}}
24+
{{#-first}}
2325

2426
/*
2527
{{{classname}}}Service{{#summary}} {{.}}{{/summary}}{{#notes}}
2628
{{notes}}{{/notes}}
2729
* @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
28-
{{#allParams}}{{#required}} * @param {{paramName}}{{#description}} {{.}}{{/description}}
29-
{{/required}}{{/allParams}}{{#hasOptionalParams}} * @param optional nil or *{{{classname}}}{{{nickname}}}Opts - Optional Parameters:
30-
{{#allParams}}{{^required}} * @param "{{vendorExtensions.x-exportParamName}}" ({{#isPrimitiveType}}optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}}optional.Interface of {{dataType}}{{/isPrimitiveType}}) - {{#description}} {{.}}{{/description}}
31-
{{/required}}{{/allParams}}{{/hasOptionalParams}}
30+
{{#parameters}}{{#required}} * @param {{paramName}}{{#description}} {{.}}{{/description}}
31+
{{/required}}{{/parameters}}{{#hasOptionalParams}} * @param optional nil or *{{{classname}}}{{{nickname}}}Opts - Optional Parameters:
32+
{{#parameters}}{{^required}} * @param "{{vendorExtensions.x-exportParamName}}" ({{#isPrimitiveType}}optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}}optional.Interface of {{dataType}}{{/isPrimitiveType}}) - {{#description}} {{.}}{{/description}}
33+
{{/required}}{{/parameters}}{{/hasOptionalParams}}
3234
{{#returnType}}@return {{{returnType}}}{{/returnType}}
3335
*/
3436
{{#hasOptionalParams}}
3537

36-
type {{{classname}}}{{{nickname}}}Opts struct { {{#allParams}}{{^required}}
37-
{{#isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.Interface{{/isPrimitiveType}}{{/required}}{{/allParams}}
38+
type {{{classname}}}{{{nickname}}}Opts struct { {{#parameters}}{{^required}}
39+
{{#isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.{{vendorExtensions.x-optionalDataType}}{{/isPrimitiveType}}{{^isPrimitiveType}} {{vendorExtensions.x-exportParamName}} optional.Interface{{/isPrimitiveType}}{{/required}}{{/parameters}}
3840
}
3941

4042
{{/hasOptionalParams}}
41-
func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}}, {{/hasParams}}{{#allParams}}{{#required}}{{paramName}} {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/required}}{{/allParams}}{{#hasOptionalParams}}localVarOptionals *{{{classname}}}{{{nickname}}}Opts{{/hasOptionalParams}}) ({{#returnType}}{{{returnType}}}, {{/returnType}}*http.Response, error) {
43+
func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}}, {{/hasParams}}{{#parameters}}{{#required}}{{paramName}} {{{dataType}}}{{#hasMore}}, {{/hasMore}}{{/required}}{{/parameters}}{{#hasOptionalParams}}localVarOptionals *{{{classname}}}{{{nickname}}}Opts{{/hasOptionalParams}}) ({{#returnType}}{{{returnType}}}, {{/returnType}}*http.Response, error) {
4244
var (
4345
localVarHttpMethod = strings.ToUpper("{{httpMethod}}")
4446
localVarPostBody interface{}
@@ -54,7 +56,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
5456
localVarHeaderParams := make(map[string]string)
5557
localVarQueryParams := url.Values{}
5658
localVarFormParams := url.Values{}
57-
{{#allParams}}
59+
{{#parameters}}
5860
{{#required}}
5961
{{#minItems}}
6062
if len({{paramName}}) < {{minItems}} {
@@ -99,7 +101,7 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
99101
}
100102
{{/maximum}}
101103
{{/required}}
102-
{{/allParams}}
104+
{{/parameters}}
103105

104106
{{#hasQueryParams}}
105107
{{#queryParams}}
@@ -263,4 +265,4 @@ func (a *{{{classname}}}Service) {{{nickname}}}(ctx context.Context{{#hasParams}
263265

264266
return {{#returnType}}localVarReturnValue, {{/returnType}}localVarHttpResponse, nil
265267
}
266-
{{/operation}}{{/operations}}
268+
{{/-first}}{{/contents}}{{/operation}}{{/operations}}

0 commit comments

Comments
 (0)