[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.
This commit is contained in:
rledisez 2024-05-01 07:28:51 -04:00 committed by GitHub
parent 10897caf37
commit 230e8ce887
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 112 additions and 92 deletions

View File

@ -120,7 +120,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float32]({{maximum}}),{{/maximum}} WithMaximum[float32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isNumber}} {{/isNumber}}
@ -134,7 +134,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float32]({{maximum}}),{{/maximum}} WithMaximum[float32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isFloat}} {{/isFloat}}
@ -148,7 +148,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float64]({{maximum}}),{{/maximum}} WithMaximum[float64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isDouble}} {{/isDouble}}
@ -162,7 +162,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int64]({{maximum}}),{{/maximum}} WithMaximum[int64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isLong}} {{/isLong}}
@ -176,14 +176,14 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int32]({{maximum}}),{{/maximum}} WithMaximum[int32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isInteger}} {{/isInteger}}
{{#isDateTime}} {{#isDateTime}}
{{paramName}}Param, err := parseTime({{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}}) {{paramName}}Param, err := parseTime({{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}})
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isDateTime}} {{/isDateTime}}
@ -203,7 +203,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
{{#isEnumRef}} {{#isEnumRef}}
{{paramName}}Param, err := New{{dataType}}FromValue({{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}}) {{paramName}}Param, err := New{{dataType}}FromValue({{#routers}}{{#mux}}params["{{baseName}}"]{{/mux}}{{#chi}}chi.URLParam(r, "{{baseName}}"){{/chi}}{{/routers}})
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isEnumRef}} {{/isEnumRef}}
@ -220,7 +220,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
if query.Has("{{baseName}}"){ if query.Has("{{baseName}}"){
param, err := parseTime(query.Get("{{baseName}}")) param, err := parseTime(query.Get("{{baseName}}"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -242,7 +242,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float32]({{maximum}}),{{/maximum}} WithMaximum[float32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -270,7 +270,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float32]({{maximum}}),{{/maximum}} WithMaximum[float32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -298,7 +298,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float64]({{maximum}}),{{/maximum}} WithMaximum[float64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -326,7 +326,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int64]({{maximum}}),{{/maximum}} WithMaximum[int64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -354,7 +354,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int32]({{maximum}}),{{/maximum}} WithMaximum[int32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -382,7 +382,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[bool]({{maximum}}),{{/maximum}} WithMaximum[bool]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -409,7 +409,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float32]({{maximum}}),{{/maximum}} WithMaximum[float32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/items.isNumber}} {{/items.isNumber}}
@ -421,7 +421,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float32]({{maximum}}),{{/maximum}} WithMaximum[float32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/items.isFloat}} {{/items.isFloat}}
@ -433,7 +433,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[float64]({{maximum}}),{{/maximum}} WithMaximum[float64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/items.isDouble}} {{/items.isDouble}}
@ -445,7 +445,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int64]({{maximum}}),{{/maximum}} WithMaximum[int64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/items.isLong}} {{/items.isLong}}
@ -457,14 +457,14 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int32]({{maximum}}),{{/maximum}} WithMaximum[int32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/items.isInteger}} {{/items.isInteger}}
{{#items.isDateTime}} {{#items.isDateTime}}
{{paramName}}Param, err := parseTimes(query.Get("{{baseName"}})) {{paramName}}Param, err := parseTimes(query.Get("{{baseName"}}))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/items.isDateTime}} {{/items.isDateTime}}
@ -487,7 +487,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
for _, param := range paramSplits { for _, param := range paramSplits {
paramEnum, err := New{{items.dataType}}FromValue(param) paramEnum, err := New{{items.dataType}}FromValue(param)
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{paramName}}Param = append({{paramName}}Param, paramEnum) {{paramName}}Param = append({{paramName}}Param, paramEnum)
@ -545,7 +545,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
param, err := ReadFormFileToTempFile(r, "{{baseName}}") param, err := ReadFormFileToTempFile(r, "{{baseName}}")
{{/isArray}} {{/isArray}}
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
@ -560,7 +560,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int64]({{maximum}}),{{/maximum}} WithMaximum[int64]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isArray}}{{/isLong}} {{/isArray}}{{/isLong}}
@ -572,7 +572,7 @@ func (c *{{classname}}Controller) {{nickname}}(w http.ResponseWriter, r *http.Re
WithMaximum[int32]({{maximum}}),{{/maximum}} WithMaximum[int32]({{maximum}}),{{/maximum}}
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "{{baseName}}", Err: err}, nil)
return return
} }
{{/isArray}}{{/isInteger}} {{/isArray}}{{/isInteger}}

View File

@ -14,7 +14,8 @@ var (
// ParsingError indicates that an error has occurred when parsing request parameters // ParsingError indicates that an error has occurred when parsing request parameters
type ParsingError struct { type ParsingError struct {
Err error Param string
Err error
} }
func (e *ParsingError) Unwrap() error { func (e *ParsingError) Unwrap() error {
@ -22,7 +23,11 @@ func (e *ParsingError) Unwrap() error {
} }
func (e *ParsingError) Error() string { func (e *ParsingError) Error() string {
return e.Err.Error() if e.Param == "" {
return e.Err.Error()
} else {
return e.Param + ": " + e.Err.Error()
}
} }
// RequiredError indicates that an error has occurred when parsing request parameters // RequiredError indicates that an error has occurred when parsing request parameters

View File

@ -166,12 +166,12 @@ func Assert{{classname}}Constraints(obj {{classname}}) error {
{{#Vars}} {{#Vars}}
{{#minimum}} {{#minimum}}
if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} < {{minimum}} { if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} < {{minimum}} {
return &ParsingError{Err: errors.New(errMsgMinValueConstraint)} return &ParsingError{Param: "{{name}}", Err: errors.New(errMsgMinValueConstraint)}
} }
{{/minimum}} {{/minimum}}
{{#maximum}} {{#maximum}}
if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} > {{maximum}} { if {{#isNullable}}obj.{{name}} != nil && *{{/isNullable}}obj.{{name}} > {{maximum}} {
return &ParsingError{Err: errors.New(errMsgMaxValueConstraint)} return &ParsingError{Param: "{{name}}", Err: errors.New(errMsgMaxValueConstraint)}
} }
{{/maximum}} {{/maximum}}
{{/Vars}} {{/Vars}}

View File

@ -129,7 +129,7 @@ func (c *PetAPIController) DeletePet(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
apiKeyParam := r.Header.Get("api_key") apiKeyParam := r.Header.Get("api_key")
@ -193,7 +193,7 @@ func (c *PetAPIController) GetPetById(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
result, err := c.service.GetPetById(r.Context(), petIdParam) result, err := c.service.GetPetById(r.Context(), petIdParam)
@ -244,7 +244,7 @@ func (c *PetAPIController) UpdatePetWithForm(w http.ResponseWriter, r *http.Requ
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -274,7 +274,7 @@ func (c *PetAPIController) UploadFile(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -284,7 +284,7 @@ func (c *PetAPIController) UploadFile(w http.ResponseWriter, r *http.Request) {
{ {
param, err := ReadFormFileToTempFile(r, "file") param, err := ReadFormFileToTempFile(r, "file")
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "file", Err: err}, nil)
return return
} }

View File

@ -112,7 +112,7 @@ func (c *StoreAPIController) GetOrderById(w http.ResponseWriter, r *http.Request
WithMaximum[int64](5), WithMaximum[int64](5),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "orderId", Err: err}, nil)
return return
} }
result, err := c.service.GetOrderById(r.Context(), orderIdParam) result, err := c.service.GetOrderById(r.Context(), orderIdParam)

View File

@ -190,7 +190,7 @@ func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "boolean_test", Err: err}, nil)
return return
} }
@ -256,7 +256,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[int32](parseInt32), WithParse[int32](parseInt32),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "int32_test", Err: err}, nil)
return return
} }
@ -270,7 +270,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[int64](parseInt64), WithParse[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "int64_test", Err: err}, nil)
return return
} }
@ -284,7 +284,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[float32](parseFloat32), WithParse[float32](parseFloat32),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "float32_test", Err: err}, nil)
return return
} }
@ -298,7 +298,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[float64](parseFloat64), WithParse[float64](parseFloat64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "float64_test", Err: err}, nil)
return return
} }
@ -312,7 +312,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "boolean_test", Err: err}, nil)
return return
} }

View File

@ -23,7 +23,8 @@ var (
// ParsingError indicates that an error has occurred when parsing request parameters // ParsingError indicates that an error has occurred when parsing request parameters
type ParsingError struct { type ParsingError struct {
Err error Param string
Err error
} }
func (e *ParsingError) Unwrap() error { func (e *ParsingError) Unwrap() error {
@ -31,7 +32,11 @@ func (e *ParsingError) Unwrap() error {
} }
func (e *ParsingError) Error() string { func (e *ParsingError) Error() string {
return e.Err.Error() if e.Param == "" {
return e.Err.Error()
} else {
return e.Param + ": " + e.Err.Error()
}
} }
// RequiredError indicates that an error has occurred when parsing request parameters // RequiredError indicates that an error has occurred when parsing request parameters

View File

@ -161,7 +161,7 @@ func (c *PetAPIController) DeletePet(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
apiKeyParam := r.Header.Get("api_key") apiKeyParam := r.Header.Get("api_key")
@ -185,7 +185,7 @@ func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.R
} }
genderParam, err := NewGenderFromValue(params["gender"]) genderParam, err := NewGenderFromValue(params["gender"])
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "gender", Err: err}, nil)
return return
} }
var speciesParam Species var speciesParam Species
@ -204,7 +204,7 @@ func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.R
for _, param := range paramSplits { for _, param := range paramSplits {
paramEnum, err := NewSpeciesFromValue(param) paramEnum, err := NewSpeciesFromValue(param)
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "notSpecies", Err: err}, nil)
return return
} }
notSpeciesParam = append(notSpeciesParam, paramEnum) notSpeciesParam = append(notSpeciesParam, paramEnum)
@ -270,7 +270,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request
if query.Has("bornAfter"){ if query.Has("bornAfter"){
param, err := parseTime(query.Get("bornAfter")) param, err := parseTime(query.Get("bornAfter"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "bornAfter", Err: err}, nil)
return return
} }
@ -283,7 +283,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request
if query.Has("bornBefore"){ if query.Has("bornBefore"){
param, err := parseTime(query.Get("bornBefore")) param, err := parseTime(query.Get("bornBefore"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "bornBefore", Err: err}, nil)
return return
} }
@ -315,7 +315,7 @@ func (c *PetAPIController) GetPetById(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
result, err := c.service.GetPetById(r.Context(), petIdParam) result, err := c.service.GetPetById(r.Context(), petIdParam)
@ -336,7 +336,7 @@ func (c *PetAPIController) GetPetImageById(w http.ResponseWriter, r *http.Reques
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
result, err := c.service.GetPetImageById(r.Context(), petIdParam) result, err := c.service.GetPetImageById(r.Context(), petIdParam)
@ -354,7 +354,7 @@ func (c *PetAPIController) GetPetsByTime(w http.ResponseWriter, r *http.Request)
params := mux.Vars(r) params := mux.Vars(r)
createdTimeParam, err := parseTime(params["createdTime"]) createdTimeParam, err := parseTime(params["createdTime"])
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "createdTime", Err: err}, nil)
return return
} }
result, err := c.service.GetPetsByTime(r.Context(), createdTimeParam) result, err := c.service.GetPetsByTime(r.Context(), createdTimeParam)
@ -381,7 +381,7 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "expr", Err: err}, nil)
return return
} }
@ -397,7 +397,7 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "grouping", Err: err}, nil)
return return
} }
@ -411,7 +411,7 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "inactive", Err: err}, nil)
return return
} }
@ -444,7 +444,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
WithParse[int64](parseInt64), WithParse[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "age", Err: err}, nil)
return return
} }
@ -458,7 +458,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
WithParse[float32](parseFloat32), WithParse[float32](parseFloat32),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "price", Err: err}, nil)
return return
} }
@ -469,7 +469,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
if query.Has("bornAfter"){ if query.Has("bornAfter"){
param, err := parseTime(query.Get("bornAfter")) param, err := parseTime(query.Get("bornAfter"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "bornAfter", Err: err}, nil)
return return
} }
@ -483,7 +483,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "old", Err: err}, nil)
return return
} }
@ -539,7 +539,7 @@ func (c *PetAPIController) UpdatePetWithForm(w http.ResponseWriter, r *http.Requ
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -570,7 +570,7 @@ func (c *PetAPIController) UploadFile(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -583,7 +583,7 @@ func (c *PetAPIController) UploadFile(w http.ResponseWriter, r *http.Request) {
{ {
param, err := ReadFormFileToTempFile(r, "file") param, err := ReadFormFileToTempFile(r, "file")
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "file", Err: err}, nil)
return return
} }
@ -613,7 +613,7 @@ func (c *PetAPIController) UploadFileArrayOfFiles(w http.ResponseWriter, r *http
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -623,7 +623,7 @@ func (c *PetAPIController) UploadFileArrayOfFiles(w http.ResponseWriter, r *http
{ {
param, err := ReadFormFilesToTempFiles(r, "files") param, err := ReadFormFilesToTempFiles(r, "files")
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "files", Err: err}, nil)
return return
} }

View File

@ -114,7 +114,7 @@ func (c *StoreAPIController) GetOrderById(w http.ResponseWriter, r *http.Request
WithMaximum[int64](5), WithMaximum[int64](5),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "orderId", Err: err}, nil)
return return
} }
result, err := c.service.GetOrderById(r.Context(), orderIdParam) result, err := c.service.GetOrderById(r.Context(), orderIdParam)

View File

@ -191,7 +191,7 @@ func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "boolean_test", Err: err}, nil)
return return
} }
@ -258,7 +258,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "boolean_test", Err: err}, nil)
return return
} }

View File

@ -23,7 +23,8 @@ var (
// ParsingError indicates that an error has occurred when parsing request parameters // ParsingError indicates that an error has occurred when parsing request parameters
type ParsingError struct { type ParsingError struct {
Err error Param string
Err error
} }
func (e *ParsingError) Unwrap() error { func (e *ParsingError) Unwrap() error {
@ -31,7 +32,11 @@ func (e *ParsingError) Unwrap() error {
} }
func (e *ParsingError) Error() string { func (e *ParsingError) Error() string {
return e.Err.Error() if e.Param == "" {
return e.Err.Error()
} else {
return e.Param + ": " + e.Err.Error()
}
} }
// RequiredError indicates that an error has occurred when parsing request parameters // RequiredError indicates that an error has occurred when parsing request parameters

View File

@ -160,7 +160,7 @@ func (c *PetAPIController) DeletePet(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
apiKeyParam := r.Header.Get("api_key") apiKeyParam := r.Header.Get("api_key")
@ -183,7 +183,7 @@ func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.R
} }
genderParam, err := NewGenderFromValue(chi.URLParam(r, "gender")) genderParam, err := NewGenderFromValue(chi.URLParam(r, "gender"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "gender", Err: err}, nil)
return return
} }
var speciesParam Species var speciesParam Species
@ -202,7 +202,7 @@ func (c *PetAPIController) FilterPetsByCategory(w http.ResponseWriter, r *http.R
for _, param := range paramSplits { for _, param := range paramSplits {
paramEnum, err := NewSpeciesFromValue(param) paramEnum, err := NewSpeciesFromValue(param)
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "notSpecies", Err: err}, nil)
return return
} }
notSpeciesParam = append(notSpeciesParam, paramEnum) notSpeciesParam = append(notSpeciesParam, paramEnum)
@ -267,7 +267,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request
if query.Has("bornAfter"){ if query.Has("bornAfter"){
param, err := parseTime(query.Get("bornAfter")) param, err := parseTime(query.Get("bornAfter"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "bornAfter", Err: err}, nil)
return return
} }
@ -280,7 +280,7 @@ func (c *PetAPIController) FindPetsByTags(w http.ResponseWriter, r *http.Request
if query.Has("bornBefore"){ if query.Has("bornBefore"){
param, err := parseTime(query.Get("bornBefore")) param, err := parseTime(query.Get("bornBefore"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "bornBefore", Err: err}, nil)
return return
} }
@ -311,7 +311,7 @@ func (c *PetAPIController) GetPetById(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
result, err := c.service.GetPetById(r.Context(), petIdParam) result, err := c.service.GetPetById(r.Context(), petIdParam)
@ -331,7 +331,7 @@ func (c *PetAPIController) GetPetImageById(w http.ResponseWriter, r *http.Reques
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
result, err := c.service.GetPetImageById(r.Context(), petIdParam) result, err := c.service.GetPetImageById(r.Context(), petIdParam)
@ -348,7 +348,7 @@ func (c *PetAPIController) GetPetImageById(w http.ResponseWriter, r *http.Reques
func (c *PetAPIController) GetPetsByTime(w http.ResponseWriter, r *http.Request) { func (c *PetAPIController) GetPetsByTime(w http.ResponseWriter, r *http.Request) {
createdTimeParam, err := parseTime(chi.URLParam(r, "createdTime")) createdTimeParam, err := parseTime(chi.URLParam(r, "createdTime"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "createdTime", Err: err}, nil)
return return
} }
result, err := c.service.GetPetsByTime(r.Context(), createdTimeParam) result, err := c.service.GetPetsByTime(r.Context(), createdTimeParam)
@ -375,7 +375,7 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "expr", Err: err}, nil)
return return
} }
@ -391,7 +391,7 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "grouping", Err: err}, nil)
return return
} }
@ -405,7 +405,7 @@ func (c *PetAPIController) GetPetsUsingBooleanQueryParameters(w http.ResponseWri
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "inactive", Err: err}, nil)
return return
} }
@ -438,7 +438,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
WithParse[int64](parseInt64), WithParse[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "age", Err: err}, nil)
return return
} }
@ -452,7 +452,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
WithParse[float32](parseFloat32), WithParse[float32](parseFloat32),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "price", Err: err}, nil)
return return
} }
@ -463,7 +463,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
if query.Has("bornAfter"){ if query.Has("bornAfter"){
param, err := parseTime(query.Get("bornAfter")) param, err := parseTime(query.Get("bornAfter"))
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "bornAfter", Err: err}, nil)
return return
} }
@ -477,7 +477,7 @@ func (c *PetAPIController) SearchPet(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "old", Err: err}, nil)
return return
} }
@ -532,7 +532,7 @@ func (c *PetAPIController) UpdatePetWithForm(w http.ResponseWriter, r *http.Requ
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -562,7 +562,7 @@ func (c *PetAPIController) UploadFile(w http.ResponseWriter, r *http.Request) {
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -575,7 +575,7 @@ func (c *PetAPIController) UploadFile(w http.ResponseWriter, r *http.Request) {
{ {
param, err := ReadFormFileToTempFile(r, "file") param, err := ReadFormFileToTempFile(r, "file")
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "file", Err: err}, nil)
return return
} }
@ -604,7 +604,7 @@ func (c *PetAPIController) UploadFileArrayOfFiles(w http.ResponseWriter, r *http
WithRequire[int64](parseInt64), WithRequire[int64](parseInt64),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "petId", Err: err}, nil)
return return
} }
@ -614,7 +614,7 @@ func (c *PetAPIController) UploadFileArrayOfFiles(w http.ResponseWriter, r *http
{ {
param, err := ReadFormFilesToTempFiles(r, "files") param, err := ReadFormFilesToTempFiles(r, "files")
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "files", Err: err}, nil)
return return
} }

View File

@ -112,7 +112,7 @@ func (c *StoreAPIController) GetOrderById(w http.ResponseWriter, r *http.Request
WithMaximum[int64](5), WithMaximum[int64](5),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "orderId", Err: err}, nil)
return return
} }
result, err := c.service.GetOrderById(r.Context(), orderIdParam) result, err := c.service.GetOrderById(r.Context(), orderIdParam)

View File

@ -190,7 +190,7 @@ func (c *UserAPIController) DeleteUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "boolean_test", Err: err}, nil)
return return
} }
@ -256,7 +256,7 @@ func (c *UserAPIController) LoginUser(w http.ResponseWriter, r *http.Request) {
WithParse[bool](parseBool), WithParse[bool](parseBool),
) )
if err != nil { if err != nil {
c.errorHandler(w, r, &ParsingError{Err: err}, nil) c.errorHandler(w, r, &ParsingError{Param: "boolean_test", Err: err}, nil)
return return
} }

View File

@ -23,7 +23,8 @@ var (
// ParsingError indicates that an error has occurred when parsing request parameters // ParsingError indicates that an error has occurred when parsing request parameters
type ParsingError struct { type ParsingError struct {
Err error Param string
Err error
} }
func (e *ParsingError) Unwrap() error { func (e *ParsingError) Unwrap() error {
@ -31,7 +32,11 @@ func (e *ParsingError) Unwrap() error {
} }
func (e *ParsingError) Error() string { func (e *ParsingError) Error() string {
return e.Err.Error() if e.Param == "" {
return e.Err.Error()
} else {
return e.Param + ": " + e.Err.Error()
}
} }
// RequiredError indicates that an error has occurred when parsing request parameters // RequiredError indicates that an error has occurred when parsing request parameters