shithub: hugo

Download patch

ref: 7fbfedf01367ff076c3c875b183789b769b99241
parent: 06f56fc983d460506d39b3a6f638b1632af07073
author: Bjørn Erik Pedersen <[email protected]>
date: Fri Apr 19 04:58:12 EDT 2019

tpl/collections: Return error on invalid input in in

See #5875

--- a/tpl/collections/collections.go
+++ b/tpl/collections/collections.go
@@ -242,9 +242,9 @@
 }
 
 // In returns whether v is in the set l.  l may be an array or slice.
-func (ns *Namespace) In(l interface{}, v interface{}) bool {
+func (ns *Namespace) In(l interface{}, v interface{}) (bool, error) {
 	if l == nil || v == nil {
-		return false
+		return false, nil
 	}
 
 	lv := reflect.ValueOf(l)
@@ -251,8 +251,7 @@
 	vv := reflect.ValueOf(v)
 
 	if !vv.Type().Comparable() {
-		// TODO(bep) consider adding error to the signature.
-		return false
+		return false, errors.Errorf("value to check must be comparable: %T", v)
 	}
 
 	// Normalize numeric types to float64 etc.
@@ -269,15 +268,15 @@
 			lvvk := normalize(lvv)
 
 			if lvvk == vvk {
-				return true
+				return true, nil
 			}
 		}
 	case reflect.String:
 		if vv.Type() == lv.Type() && strings.Contains(lv.String(), vv.String()) {
-			return true
+			return true, nil
 		}
 	}
-	return false
+	return false, nil
 }
 
 // Intersect returns the common elements in the given sets, l1 and l2.  l1 and
--- a/tpl/collections/collections_test.go
+++ b/tpl/collections/collections_test.go
@@ -313,9 +313,14 @@
 
 		errMsg := fmt.Sprintf("[%d] %v", i, test)
 
-		result := ns.In(test.l1, test.l2)
+		result, err := ns.In(test.l1, test.l2)
+		assert.NoError(err)
 		assert.Equal(test.expect, result, errMsg)
 	}
+
+	// Slices are not comparable
+	_, err := ns.In([]string{"a", "b"}, []string{"a", "b"})
+	assert.Error(err)
 }
 
 type testPage struct {
--- a/tpl/collections/where.go
+++ b/tpl/collections/where.go
@@ -225,14 +225,14 @@
 		var r bool
 		switch {
 		case ivp != nil && len(ima) > 0:
-			r = ns.In(ima, *ivp)
+			r, _ = ns.In(ima, *ivp)
 		case fvp != nil && len(fma) > 0:
-			r = ns.In(fma, *fvp)
+			r, _ = ns.In(fma, *fvp)
 		case svp != nil:
 			if len(sma) > 0 {
-				r = ns.In(sma, *svp)
+				r, _ = ns.In(sma, *svp)
 			} else if smvp != nil {
-				r = ns.In(*smvp, *svp)
+				r, _ = ns.In(*smvp, *svp)
 			}
 		default:
 			return false, nil