mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
tpl: Cast IsSet key to int for indexed types
Don't assume that the user sends an int as the key when checking against indexed types. Fixes #3681
This commit is contained in:
parent
d3b81ee58e
commit
0d5110d033
2 changed files with 15 additions and 9 deletions
|
@ -344,7 +344,11 @@ func (ns *Namespace) IsSet(a interface{}, key interface{}) (bool, error) {
|
||||||
|
|
||||||
switch av.Kind() {
|
switch av.Kind() {
|
||||||
case reflect.Array, reflect.Chan, reflect.Slice:
|
case reflect.Array, reflect.Chan, reflect.Slice:
|
||||||
if int64(av.Len()) > kv.Int() {
|
k, err := cast.ToIntE(key)
|
||||||
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("isset unable to use key of type %T as index", key)
|
||||||
|
}
|
||||||
|
if av.Len() > k {
|
||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
|
|
|
@ -438,22 +438,24 @@ func TestIsSet(t *testing.T) {
|
||||||
key interface{}
|
key interface{}
|
||||||
expect bool
|
expect bool
|
||||||
isErr bool
|
isErr bool
|
||||||
errStr string
|
|
||||||
}{
|
}{
|
||||||
{[]interface{}{1, 2, 3, 5}, 2, true, false, ""},
|
{[]interface{}{1, 2, 3, 5}, 2, true, false},
|
||||||
{[]interface{}{1, 2, 3, 5}, 22, false, false, ""},
|
{[]interface{}{1, 2, 3, 5}, "2", true, false},
|
||||||
|
{[]interface{}{1, 2, 3, 5}, 2.0, true, false},
|
||||||
|
|
||||||
{map[string]interface{}{"a": 1, "b": 2}, "b", true, false, ""},
|
{[]interface{}{1, 2, 3, 5}, 22, false, false},
|
||||||
{map[string]interface{}{"a": 1, "b": 2}, "bc", false, false, ""},
|
|
||||||
|
|
||||||
{time.Now(), "Day", false, false, ""},
|
{map[string]interface{}{"a": 1, "b": 2}, "b", true, false},
|
||||||
{nil, "nil", false, false, ""},
|
{map[string]interface{}{"a": 1, "b": 2}, "bc", false, false},
|
||||||
|
|
||||||
|
{time.Now(), "Day", false, false},
|
||||||
|
{nil, "nil", false, false},
|
||||||
|
{[]interface{}{1, 2, 3, 5}, TstX{}, false, true},
|
||||||
} {
|
} {
|
||||||
errMsg := fmt.Sprintf("[%d] %v", i, test)
|
errMsg := fmt.Sprintf("[%d] %v", i, test)
|
||||||
|
|
||||||
result, err := ns.IsSet(test.a, test.key)
|
result, err := ns.IsSet(test.a, test.key)
|
||||||
if test.isErr {
|
if test.isErr {
|
||||||
assert.EqualError(t, err, test.errStr, errMsg)
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue