-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Closed
Description
Package version eg. v9, v10:
v10
Issue, Question or Enhancement:
Issue
Code sample, to showcase or reproduce:
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type CreateRequest struct {
Name string `json:"name" binding:"required,lte=50"`
Description string `json:"description" binding:"lte=2048"`
AppID uint `json:"appID" binding:"required"`
ForDeletion bool `json:"forDeletion"`
Delete string
Resources []Resource `json:"resources" binding:"required_if=ForDeletion true"`
}
type Resource struct {
Type string `json:"type" binding:"required"`
Content string `json:"content" binding:"required"`
Name string `json:"name" binding:"required,dns1123"`
}
func main() {
validate := validator.New()
validate.SetTagName("binding")
req := CreateRequest{
Name: "test",
AppID: 1,
Delete: "false",
//Resources: []Resource{},
}
err := validate.Struct(req)
if err == nil {
fmt.Println("no error")
return
}
if _, ok := err.(*validator.InvalidValidationError); ok {
fmt.Println(err)
return
}
for _, err := range err.(validator.ValidationErrors) {
fmt.Println(err)
}
}I checked how requiredIf/requiredUnless is implemented, it seems this function doesn't has bool branch:
func requireCheckFieldValue(fl FieldLevel, param string, value string, defaultNotFoundValue bool) bool {
field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param)
if !found {
return defaultNotFoundValue
}
switch kind {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return field.Int() == asInt(value)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return field.Uint() == asUint(value)
case reflect.Float32, reflect.Float64:
return field.Float() == asFloat(value)
case reflect.Slice, reflect.Map, reflect.Array:
return int64(field.Len()) == asInt(value)
}
// default reflect.String:
return field.return field.String() == value
}I tried add a bool branch test like this and it worked:
func requireCheckFieldValue(fl FieldLevel, param string, value string, defaultNotFoundValue bool) bool {
field, kind, _, found := fl.GetStructFieldOKAdvanced2(fl.Parent(), param)
if !found {
return defaultNotFoundValue
}
switch kind {
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return field.Int() == asInt(value)
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return field.Uint() == asUint(value)
case reflect.Float32, reflect.Float64:
return field.Float() == asFloat(value)
case reflect.Slice, reflect.Map, reflect.Array:
return int64(field.Len()) == asInt(value)
case reflect.Bool:
return field.Bool() == asBool(value)
}
// default reflect.String:
return field.String() == value
}The last return feld.String() == value doesn't work on bool field, because the String() will return <bool Value>
akash092, lixag, leefernandes, jpreese, jkeys089 and 1 more
Metadata
Metadata
Assignees
Labels
No labels