Skip to content

Commit 230e8ce

Browse files
authored
[go-server] add field name in parsing error messages (#18533)
Currently when a parsing rule of a field is not respected (eg: min/max value, required, ...), the api only returns an error message without providing the field name to help the user to fix the request. This commit add the field name to the error message to help the user of the API.
1 parent 10897ca commit 230e8ce

File tree

15 files changed

+112
-92
lines changed

15 files changed

+112
-92
lines changed

modules/openapi-generator/src/main/resources/go-server/controller-api.mustache

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
120120
WithMaximum[float32]({{maximum}}),{{/maximum}}
121121
)
122122
if err != nil {
123-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
123+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
124124
return
125125
}
126126
{{/isNumber}}
@@ -134,7 +134,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
134134
WithMaximum[float32]({{maximum}}),{{/maximum}}
135135
)
136136
if err != nil {
137-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
137+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
138138
return
139139
}
140140
{{/isFloat}}
@@ -148,7 +148,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
148148
WithMaximum[float64]({{maximum}}),{{/maximum}}
149149
)
150150
if err != nil {
151-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
151+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
152152
return
153153
}
154154
{{/isDouble}}
@@ -162,7 +162,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
162162
WithMaximum[int64]({{maximum}}),{{/maximum}}
163163
)
164164
if err != nil {
165-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
165+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
166166
return
167167
}
168168
{{/isLong}}
@@ -176,14 +176,14 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
176176
WithMaximum[int32]({{maximum}}),{{/maximum}}
177177
)
178178
if err != nil {
179-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
179+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
180180
return
181181
}
182182
{{/isInteger}}
183183
{{#isDateTime}}
184184
{{paramName}}Param, err := parseTime({{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}})
185185
if err != nil {
186-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
186+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
187187
return
188188
}
189189
{{/isDateTime}}
@@ -203,7 +203,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
203203
{{#isEnumRef}}
204204
{{paramName}}Param, err := New{{dataType}}FromValue({{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}})
205205
if err != nil {
206-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
206+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
207207
return
208208
}
209209
{{/isEnumRef}}
@@ -220,7 +220,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
220220
if query.Has("{{baseName}}"){
221221
param, err := parseTime(query.Get("{{baseName}}"))
222222
if err != nil {
223-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
223+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
224224
return
225225
}
226226

@@ -242,7 +242,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
242242
WithMaximum[float32]({{maximum}}),{{/maximum}}
243243
)
244244
if err != nil {
245-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
245+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
246246
return
247247
}
248248

@@ -270,7 +270,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
270270
WithMaximum[float32]({{maximum}}),{{/maximum}}
271271
)
272272
if err != nil {
273-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
273+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
274274
return
275275
}
276276

@@ -298,7 +298,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
298298
WithMaximum[float64]({{maximum}}),{{/maximum}}
299299
)
300300
if err != nil {
301-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
301+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
302302
return
303303
}
304304

@@ -326,7 +326,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
326326
WithMaximum[int64]({{maximum}}),{{/maximum}}
327327
)
328328
if err != nil {
329-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
329+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
330330
return
331331
}
332332

@@ -354,7 +354,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
354354
WithMaximum[int32]({{maximum}}),{{/maximum}}
355355
)
356356
if err != nil {
357-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
357+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
358358
return
359359
}
360360

@@ -382,7 +382,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
382382
WithMaximum[bool]({{maximum}}),{{/maximum}}
383383
)
384384
if err != nil {
385-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
385+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
386386
return
387387
}
388388

@@ -409,7 +409,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
409409
WithMaximum[float32]({{maximum}}),{{/maximum}}
410410
)
411411
if err != nil {
412-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
412+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
413413
return
414414
}
415415
{{/items.isNumber}}
@@ -421,7 +421,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
421421
WithMaximum[float32]({{maximum}}),{{/maximum}}
422422
)
423423
if err != nil {
424-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
424+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
425425
return
426426
}
427427
{{/items.isFloat}}
@@ -433,7 +433,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
433433
WithMaximum[float64]({{maximum}}),{{/maximum}}
434434
)
435435
if err != nil {
436-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
436+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
437437
return
438438
}
439439
{{/items.isDouble}}
@@ -445,7 +445,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
445445
WithMaximum[int64]({{maximum}}),{{/maximum}}
446446
)
447447
if err != nil {
448-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
448+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
449449
return
450450
}
451451
{{/items.isLong}}
@@ -457,14 +457,14 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
457457
WithMaximum[int32]({{maximum}}),{{/maximum}}
458458
)
459459
if err != nil {
460-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
460+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
461461
return
462462
}
463463
{{/items.isInteger}}
464464
{{#items.isDateTime}}
465465
{{paramName}}Param, err := parseTimes(query.Get("{{baseName"}}))
466466
if err != nil {
467-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
467+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
468468
return
469469
}
470470
{{/items.isDateTime}}
@@ -487,7 +487,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
487487
for _, param := range paramSplits {
488488
paramEnum, err := New{{items.dataType}}FromValue(param)
489489
if err != nil {
490-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
490+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
491491
return
492492
}
493493
{{paramName}}Param = append({{paramName}}Param, paramEnum)
@@ -545,7 +545,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
545545
param, err := ReadFormFileToTempFile(r, "{{baseName}}")
546546
{{/isArray}}
547547
if err != nil {
548-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
548+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
549549
return
550550
}
551551

@@ -560,7 +560,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
560560
WithMaximum[int64]({{maximum}}),{{/maximum}}
561561
)
562562
if err != nil {
563-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
563+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
564564
return
565565
}
566566
{{/isArray}}{{/isLong}}
@@ -572,7 +572,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
572572
WithMaximum[int32]({{maximum}}),{{/maximum}}
573573
)
574574
if err != nil {
575-
c.errorHandler(w, r, &ParsingError{Err: err}, nil)
575+
c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
576576
return
577577
}
578578
{{/isArray}}{{/isInteger}}

modules/openapi-generator/src/main/resources/go-server/error.mustache

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,20 @@ var (
1414

1515
// ParsingError indicates that an error has occurred when parsing request parameters
1616
type ParsingError struct {
17-
Err error
17+
Param string
18+
Err error
1819
}
1920

2021
func (e *ParsingError) Unwrap() error {
2122
return e.Err
2223
}
2324

2425
func (e *ParsingError) Error() string {
25-
return e.Err.Error()
26+
if e.Param == "" {
27+
return e.Err.Error()
28+
} else {
29+
return e.Param + ": " + e.Err.Error()
30+
}
2631
}
2732

2833
// RequiredError indicates that an error has occurred when parsing request parameters

modules/openapi-generator/src/main/resources/go-server/model.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,12 @@ func Assert{{classname}}Constraints(obj {{classname}}) error {
166166
{{#Vars}}
167167
{{#minimum}}
168168
if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} < {{minimum}} {
169-
return &ParsingError{Err: errors.New(errMsgMinValueConstraint)}
169+
return &ParsingError{Param: "{{name}}", Err: errors.New(errMsgMinValueConstraint)}
170170
}
171171
{{/minimum}}
172172
{{#maximum}}
173173
if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} > {{maximum}} {
174-
return &ParsingError{Err: errors.New(errMsgMaxValueConstraint)}
174+
return &ParsingError{Param: "{{name}}", Err: errors.New(errMsgMaxValueConstraint)}
175175
}
176176
{{/maximum}}
177177
{{/Vars}}

samples/openapi3/server/petstore/go/go-petstore/go/api_pet.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/openapi3/server/petstore/go/go-petstore/go/api_store.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/openapi3/server/petstore/go/go-petstore/go/api_user.go

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

samples/openapi3/server/petstore/go/go-petstore/go/error.go

Lines changed: 7 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)