diff --git a/issues_test.go b/issues_test.go index bd867f9..4eebb75 100644 --- a/issues_test.go +++ b/issues_test.go @@ -1915,3 +1915,38 @@ func TestIssue_302(t *testing.T) { assert.True(t, v.Validate()) assert.Empty(t, v.Errors.One()) } + +func TestIssue_328(t *testing.T) { + type Test struct { + Domains []string `form:"domains" json:"domains" validate:"required|isSlice"` + Index []string `form:"index" json:"index" validate:"required|isSlice"` + } + + t.Run("success_with_struct", func(t *testing.T) { + df, err := validate.FromStruct(&Test{ + Domains: []string{"example.com", "test.com", "a.com"}, + Index: []string{"index.php"}, + }) + assert.NoError(t, err) + v := df.Create() + v.StringRule("Domains.*", "required") + v.StringRule("Index.*", "required") + + assert.True(t, v.Validate()) + }) + + t.Run("success_with_json", func(t *testing.T) { + data := `{"domains":["example.com","test.com","a.com"],"index":["index.php"]}` + req := new(Test) + err := jsonutil.DecodeString(data, req) + assert.NoError(t, err) + + df, err := validate.FromStruct(req) + assert.NoError(t, err) + v := df.Create() + v.StringRule("Domains.*", "required") + v.StringRule("Index.*", "required") + + assert.True(t, v.Validate()) + }) +} diff --git a/validating.go b/validating.go index c3257d7..622d1d5 100644 --- a/validating.go +++ b/validating.go @@ -299,17 +299,17 @@ func (r *Rule) valueValidate(field, name string, val any, v *Validation) (ok boo valKind := rftVal.Kind() if valKind == reflect.Slice && dotStarNum > 0 { - sliceLen, sliceCap := rftVal.Len(), rftVal.Cap() + sliceLen := rftVal.Len() // if dotStarNum > 1, need flatten multi level slice with depth=dotStarNum. if dotStarNum > 1 { rftVal = flatSlice(rftVal, dotStarNum-1) - sliceLen, sliceCap = rftVal.Len(), rftVal.Cap() + sliceLen = rftVal.Len() } // check requiredXX validate - flatten multi level slice, count ".*" number. - // TIP: if len < cap: not enough elements in the slice. use empty val call validator. - if !r.nameNotRequired && sliceLen < sliceCap { + // TIP: if len == 0: no elements in the slice. use empty val call validator. + if !r.nameNotRequired && sliceLen == 0 { return callValidator(v, fm, field, nil, r.arguments, addNum) }