From d330afdd36568ed69d146e2f4bb1de4e48aebe3a Mon Sep 17 00:00:00 2001 From: John Guo Date: Wed, 24 Feb 2021 01:20:06 +0800 Subject: [PATCH] add required* rules checks for map/slice --- util/gvalid/gvalid_validator_check.go | 2 +- util/gvalid/gvalid_validator_rule_required.go | 27 +++++++++++++------ util/gvalid/gvalid_z_example_test.go | 8 +++--- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/util/gvalid/gvalid_validator_check.go b/util/gvalid/gvalid_validator_check.go index 035276256..674f5d761 100644 --- a/util/gvalid/gvalid_validator_check.go +++ b/util/gvalid/gvalid_validator_check.go @@ -158,7 +158,7 @@ func (v *Validator) doCheckBuildInRules( "required-with-all", "required-without", "required-without-all": - match = v.checkRequired(valueStr, ruleKey, rulePattern, dataMap) + match = v.checkRequired(value, ruleKey, rulePattern, dataMap) // Length rules. // It also supports length of unicode string. diff --git a/util/gvalid/gvalid_validator_rule_required.go b/util/gvalid/gvalid_validator_rule_required.go index 0578e3212..162c97a57 100644 --- a/util/gvalid/gvalid_validator_rule_required.go +++ b/util/gvalid/gvalid_validator_rule_required.go @@ -7,11 +7,14 @@ package gvalid import ( + "github.com/gogf/gf/util/gconv" + "reflect" "strings" ) // checkRequired checks using required rules. -func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[string]string) bool { +// It also supports require checks for `value` of type: slice, map. +func (v *Validator) checkRequired(value interface{}, ruleKey, rulePattern string, params map[string]string) bool { required := false switch ruleKey { // Required. @@ -22,7 +25,7 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str // Example: required-if: id,1,age,18 case "required-if": required = false - array := strings.Split(ruleVal, ",") + array := strings.Split(rulePattern, ",") // It supports multiple field and value pairs. if len(array)%2 == 0 { for i := 0; i < len(array); { @@ -42,7 +45,7 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str // Example: required-unless: id,1,age,18 case "required-unless": required = true - array := strings.Split(ruleVal, ",") + array := strings.Split(rulePattern, ",") // It supports multiple field and value pairs. if len(array)%2 == 0 { for i := 0; i < len(array); { @@ -62,7 +65,7 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str // Example: required-with:id,name case "required-with": required = false - array := strings.Split(ruleVal, ",") + array := strings.Split(rulePattern, ",") for i := 0; i < len(array); i++ { if params[array[i]] != "" { required = true @@ -74,7 +77,7 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str // Example: required-with:id,name case "required-with-all": required = true - array := strings.Split(ruleVal, ",") + array := strings.Split(rulePattern, ",") for i := 0; i < len(array); i++ { if params[array[i]] == "" { required = false @@ -86,7 +89,7 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str // Example: required-with:id,name case "required-without": required = false - array := strings.Split(ruleVal, ",") + array := strings.Split(rulePattern, ",") for i := 0; i < len(array); i++ { if params[array[i]] == "" { required = true @@ -98,7 +101,7 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str // Example: required-with:id,name case "required-without-all": required = true - array := strings.Split(ruleVal, ",") + array := strings.Split(rulePattern, ",") for i := 0; i < len(array); i++ { if params[array[i]] != "" { required = false @@ -107,7 +110,15 @@ func (v *Validator) checkRequired(value, ruleKey, ruleVal string, params map[str } } if required { - return !(value == "") + reflectValue := reflect.ValueOf(value) + for reflectValue.Kind() == reflect.Ptr { + reflectValue = reflectValue.Elem() + } + switch reflectValue.Kind() { + case reflect.String, reflect.Map, reflect.Array, reflect.Slice: + return reflectValue.Len() != 0 + } + return gconv.String(value) != "" } else { return true } diff --git a/util/gvalid/gvalid_z_example_test.go b/util/gvalid/gvalid_z_example_test.go index 4411345b7..2fa6cedfa 100644 --- a/util/gvalid/gvalid_z_example_test.go +++ b/util/gvalid/gvalid_z_example_test.go @@ -173,13 +173,13 @@ func ExampleRegisterRule_OverwriteRequired() { return nil }) fmt.Println(gvalid.Check("", "required", "It's required")) - fmt.Println(gvalid.Check([]string{}, "required", "It's required")) - fmt.Println(gvalid.Check(map[string]int{}, "required", "It's required")) + fmt.Println(gvalid.Check(0, "required", "It's required")) + fmt.Println(gvalid.Check(false, "required", "It's required")) gvalid.DeleteRule(rule) fmt.Println("rule deleted") fmt.Println(gvalid.Check("", "required", "It's required")) - fmt.Println(gvalid.Check([]string{}, "required", "It's required")) - fmt.Println(gvalid.Check(map[string]int{}, "required", "It's required")) + fmt.Println(gvalid.Check(0, "required", "It's required")) + fmt.Println(gvalid.Check(false, "required", "It's required")) // Output: // It's required // It's required