From d87f088b8f52e2134dd25be74401627421d88eff Mon Sep 17 00:00:00 2001 From: "Thibault \"bui\" Koechlin" Date: Tue, 21 Mar 2023 10:39:17 +0100 Subject: [PATCH] match expr helper (#2126) * match expr helper --- pkg/exprhelpers/exprlib.go | 26 ++++++++++++++++++++++++++ pkg/exprhelpers/exprlib_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/pkg/exprhelpers/exprlib.go b/pkg/exprhelpers/exprlib.go index ec1fa6357..e1d82be4e 100644 --- a/pkg/exprhelpers/exprlib.go +++ b/pkg/exprhelpers/exprlib.go @@ -123,6 +123,7 @@ func GetExprEnv(ctx map[string]interface{}) map[string]interface{} { "Get": Get, "String": ToString, "Distance": Distance, + "Match": Match, } for k, v := range ctx { ExprLib[k] = v @@ -493,3 +494,28 @@ func ToString(value interface{}) string { } return s } + +func Match(pattern, name string) bool { + var matched bool + if pattern == "" { + return name == "" + } + if name == "" { + if pattern == "*" || pattern == "" { + return true + } + return false + } + if pattern[0] == '*' { + for i := 0; i <= len(name); i++ { + if matched = Match(pattern[1:], name[i:]); matched { + return matched + } + } + return matched + } + if pattern[0] == '?' || pattern[0] == name[0] { + return Match(pattern[1:], name[1:]) + } + return matched +} diff --git a/pkg/exprhelpers/exprlib_test.go b/pkg/exprhelpers/exprlib_test.go index 3413bc068..49f1ba1c9 100644 --- a/pkg/exprhelpers/exprlib_test.go +++ b/pkg/exprhelpers/exprlib_test.go @@ -125,6 +125,38 @@ func TestVisitor(t *testing.T) { } } +func TestMatch(t *testing.T) { + tests := []struct { + glob string + val string + ret bool + }{ + {"foo", "foo", true}, + {"foo", "bar", false}, + {"foo*", "foo", true}, + {"foo*", "foobar", true}, + {"foo*", "barfoo", false}, + {"foo*", "bar", false}, + {"*foo", "foo", true}, + {"*foo", "barfoo", true}, + {"foo*r", "foobar", true}, + {"foo*r", "foobazr", true}, + {"foo?ar", "foobar", true}, + {"foo?ar", "foobazr", false}, + {"foo?ar", "foobaz", false}, + {"*foo?ar?", "foobar", false}, + {"*foo?ar?", "foobare", true}, + {"*foo?ar?", "rafoobar", false}, + {"*foo?ar?", "rafoobare", true}, + } + for _, test := range tests { + ret := Match(test.glob, test.val) + if isOk := assert.Equal(t, test.ret, ret); !isOk { + t.Fatalf("pattern:%s val:%s NOK %t != %t", test.glob, test.val, ret, test.ret) + } + } +} + func TestDistanceHelper(t *testing.T) { //one set of coord is empty