diff --git a/util/gvalid/gvalid_check_map.go b/util/gvalid/gvalid_check_map.go index 8f4b139c9..d24612790 100644 --- a/util/gvalid/gvalid_check_map.go +++ b/util/gvalid/gvalid_check_map.go @@ -89,8 +89,10 @@ func CheckMap(params interface{}, rules interface{}, messages ...CustomMsg) *Err } if e := doCheck(key, value, rule, customMsgs[key], data); e != nil { _, item := e.FirstItem() + // =========================================================== // If value is nil or empty string and has no required* rules, // clear the error message. + // =========================================================== if gconv.String(value) == "" { required := false // rule => error diff --git a/util/gvalid/gvalid_check_struct.go b/util/gvalid/gvalid_check_struct.go index ee368a0f0..400c1e848 100644 --- a/util/gvalid/gvalid_check_struct.go +++ b/util/gvalid/gvalid_check_struct.go @@ -151,8 +151,10 @@ func CheckStruct(object interface{}, rules interface{}, messages ...CustomMsg) * } if e := doCheck(key, value, rule, customMessage[key], params); e != nil { _, item := e.FirstItem() + // =========================================================== // If value is nil or empty string and has no required* rules, // clear the error message. + // =========================================================== if value == nil || gconv.String(value) == "" { required := false // rule => error diff --git a/util/gvalid/gvalid_custom_rule.go b/util/gvalid/gvalid_custom_rule.go index 45cd5d2e7..4cac5907e 100644 --- a/util/gvalid/gvalid_custom_rule.go +++ b/util/gvalid/gvalid_custom_rule.go @@ -25,7 +25,7 @@ var ( // It returns error if there's already the same rule registered previously. func RegisterRule(rule string, f RuleFunc) error { if _, ok := allSupportedRules[rule]; ok { - return fmt.Errorf(`validation rule "%s" is already registed`, rule) + return fmt.Errorf(`validation rule "%s" is already registered`, rule) } allSupportedRules[rule] = struct{}{} customRuleFuncMap[rule] = f diff --git a/util/gvalid/gvalid_unit_checkstruct_test.go b/util/gvalid/gvalid_unit_checkstruct_test.go index 08b820040..84bfc197b 100755 --- a/util/gvalid/gvalid_unit_checkstruct_test.go +++ b/util/gvalid/gvalid_unit_checkstruct_test.go @@ -250,3 +250,32 @@ func Test_CheckStruct_With_Inherit(t *testing.T) { t.Assert(err.Maps()["password2"], g.Map{"same": "您两次输入的密码不一致"}) }) } + +func Test_CheckStruct_Optional(t *testing.T) { + gtest.C(t, func(t *gtest.T) { + type Params struct { + Page int `v:"required|min:1 #page is required"` + Size int `v:"required|between:1,100#size is required"` + ProjectId string `v:"between:1,10000 #project id must between :min, :max"` + } + obj := &Params{ + Page: 1, + Size: 1, + } + err := gvalid.CheckStruct(obj, nil) + t.Assert(err, nil) + }) + gtest.C(t, func(t *gtest.T) { + type Params struct { + Page int `v:"required|min:1 #page is required"` + Size int `v:"required|between:1,100#size is required"` + ProjectId int `v:"between:1,10000 #project id must between :min, :max"` + } + obj := &Params{ + Page: 1, + Size: 1, + } + err := gvalid.CheckStruct(obj, nil) + t.Assert(err.String(), "project id must between 1, 10000") + }) +}