hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit bca40cf0c9c7b75e6d5b4a9ac8b927eb17590c7e
parent 057e5a22af937459082c3096ba3095b343d1a8bf
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Wed, 21 Apr 2021 09:08:42 +0200

Fix Params case handling in where with slices of structs (e.g. Pages)

Fixes #7009

Diffstat:
Mtpl/collections/where.go | 11++++++++++-
Mtpl/collections/where_test.go | 18++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/tpl/collections/where.go b/tpl/collections/where.go
@@ -382,12 +382,21 @@ func (ns *Namespace) checkWhereArray(seqv, kv, mv reflect.Value, path []string, 
 				vvv = reflect.ValueOf(params.Get(path...))
 			} else {
 				vvv = rvv
-				for _, elemName := range path {
+				for i, elemName := range path {
 					var err error
 					vvv, err = evaluateSubElem(vvv, elemName)
+
 					if err != nil {
 						continue
 					}
+
+					if i < len(path)-1 && vvv.IsValid() {
+						if params, ok := vvv.Interface().(maps.Params); ok {
+							// The current path element is the map itself, .Params.
+							vvv = reflect.ValueOf(params.Get(path[i+1:]...))
+							break
+						}
+					}
 				}
 			}
 		} else {
diff --git a/tpl/collections/where_test.go b/tpl/collections/where_test.go
@@ -164,6 +164,24 @@ func TestWhere(t *testing.T) {
 				{1: "a", 2: "m"},
 			},
 		},
+		// Case insensitive maps.Params
+		// Slice of structs
+		{
+			seq: []TstParams{{params: maps.Params{"i": 0, "color": "indigo"}}, {params: maps.Params{"i": 1, "color": "blue"}}, {params: maps.Params{"i": 2, "color": "green"}}, {params: maps.Params{"i": 3, "color": "blue"}}},
+			key: ".Params.COLOR", match: "blue",
+			expect: []TstParams{{params: maps.Params{"i": 1, "color": "blue"}}, {params: maps.Params{"i": 3, "color": "blue"}}},
+		},
+		{
+			seq: []TstParams{{params: maps.Params{"nested": map[string]interface{}{"color": "indigo"}}}, {params: maps.Params{"nested": map[string]interface{}{"color": "blue"}}}},
+			key: ".Params.NEsTED.COLOR", match: "blue",
+			expect: []TstParams{{params: maps.Params{"nested": map[string]interface{}{"color": "blue"}}}},
+		},
+		{
+			seq: []TstParams{{params: maps.Params{"i": 0, "color": "indigo"}}, {params: maps.Params{"i": 1, "color": "blue"}}, {params: maps.Params{"i": 2, "color": "green"}}, {params: maps.Params{"i": 3, "color": "blue"}}},
+			key: ".Params", match: "blue",
+			expect: []TstParams{},
+		},
+		// Slice of maps
 		{
 			seq: []maps.Params{
 				{"a": "a1", "b": "b1"}, {"a": "a2", "b": "b2"},