From 98f1145ecd5f9b4716d0ec70ae087f869e8aeb99 Mon Sep 17 00:00:00 2001 From: Rohit Jangid Date: Wed, 3 May 2023 18:02:41 +0530 Subject: [PATCH] feat: implement std.isEqualIgnoreCase --- builtins.go | 13 +++++++ linter/internal/types/stdlib.go | 37 ++++++++++--------- testdata/builtinEqualsIgnoreCase.golden | 1 + testdata/builtinEqualsIgnoreCase.jsonnet | 1 + .../builtinEqualsIgnoreCase.linter.golden | 0 testdata/builtinEqualsIgnoreCase2.golden | 1 + testdata/builtinEqualsIgnoreCase2.jsonnet | 1 + .../builtinEqualsIgnoreCase2.linter.golden | 0 8 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 testdata/builtinEqualsIgnoreCase.golden create mode 100644 testdata/builtinEqualsIgnoreCase.jsonnet create mode 100644 testdata/builtinEqualsIgnoreCase.linter.golden create mode 100644 testdata/builtinEqualsIgnoreCase2.golden create mode 100644 testdata/builtinEqualsIgnoreCase2.jsonnet create mode 100644 testdata/builtinEqualsIgnoreCase2.linter.golden diff --git a/builtins.go b/builtins.go index 875fd5f2..7c9fb8d4 100644 --- a/builtins.go +++ b/builtins.go @@ -1289,6 +1289,18 @@ func builtinIsEmpty(i *interpreter, strv value) (value, error) { return makeValueBoolean(len(sStr) == 0), nil } +func builtinEqualsIgnoreCase(i *interpreter, sv1, sv2 value) (value, error) { + s1, err := i.getString(sv1) + if err != nil { + return nil, err + } + s2, err := i.getString(sv2) + if err != nil { + return nil, err + } + return makeValueBoolean(strings.EqualFold(s1.getGoString(), s2.getGoString())), nil +} + func base64DecodeGoBytes(i *interpreter, str string) ([]byte, error) { strLen := len(str) if strLen%4 != 0 { @@ -2285,6 +2297,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{ &ternaryBuiltin{name: "splitLimit", function: builtinSplitLimit, params: ast.Identifiers{"str", "c", "maxsplits"}}, &ternaryBuiltin{name: "strReplace", function: builtinStrReplace, params: ast.Identifiers{"str", "from", "to"}}, &unaryBuiltin{name: "isEmpty", function: builtinIsEmpty, params: ast.Identifiers{"str"}}, + &binaryBuiltin{name: "equalsIgnoreCase", function: builtinEqualsIgnoreCase, params: ast.Identifiers{"str1", "str2"}}, &unaryBuiltin{name: "base64Decode", function: builtinBase64Decode, params: ast.Identifiers{"str"}}, &unaryBuiltin{name: "base64DecodeBytes", function: builtinBase64DecodeBytes, params: ast.Identifiers{"str"}}, &unaryBuiltin{name: "parseInt", function: builtinParseInt, params: ast.Identifiers{"str"}}, diff --git a/linter/internal/types/stdlib.go b/linter/internal/types/stdlib.go index dee12b27..e82b8ae8 100644 --- a/linter/internal/types/stdlib.go +++ b/linter/internal/types/stdlib.go @@ -72,24 +72,25 @@ func prepareStdlib(g *typeGraph) { // String Manipulation - "toString": g.newSimpleFuncType(stringType, "a"), - "codepoint": g.newSimpleFuncType(numberType, "str"), - "char": g.newSimpleFuncType(stringType, "n"), - "substr": g.newSimpleFuncType(stringType, "str", "from", "len"), - "findSubstr": g.newSimpleFuncType(numberArrayType, "pat", "str"), - "startsWith": g.newSimpleFuncType(boolType, "a", "b"), - "endsWith": g.newSimpleFuncType(boolType, "a", "b"), - "stripChars": g.newSimpleFuncType(stringType, "str", "chars"), - "lstripChars": g.newSimpleFuncType(stringType, "str", "chars"), - "rstripChars": g.newSimpleFuncType(stringType, "str", "chars"), - "split": g.newSimpleFuncType(arrayOfString, "str", "c"), - "splitLimit": g.newSimpleFuncType(arrayOfString, "str", "c", "maxsplits"), - "strReplace": g.newSimpleFuncType(stringType, "str", "from", "to"), - "asciiUpper": g.newSimpleFuncType(stringType, "str"), - "asciiLower": g.newSimpleFuncType(stringType, "str"), - "stringChars": g.newSimpleFuncType(stringType, "str"), - "format": g.newSimpleFuncType(stringType, "str", "vals"), - "isEmpty": g.newSimpleFuncType(boolType, "str"), + "toString": g.newSimpleFuncType(stringType, "a"), + "codepoint": g.newSimpleFuncType(numberType, "str"), + "char": g.newSimpleFuncType(stringType, "n"), + "substr": g.newSimpleFuncType(stringType, "str", "from", "len"), + "findSubstr": g.newSimpleFuncType(numberArrayType, "pat", "str"), + "startsWith": g.newSimpleFuncType(boolType, "a", "b"), + "endsWith": g.newSimpleFuncType(boolType, "a", "b"), + "stripChars": g.newSimpleFuncType(stringType, "str", "chars"), + "lstripChars": g.newSimpleFuncType(stringType, "str", "chars"), + "rstripChars": g.newSimpleFuncType(stringType, "str", "chars"), + "split": g.newSimpleFuncType(arrayOfString, "str", "c"), + "splitLimit": g.newSimpleFuncType(arrayOfString, "str", "c", "maxsplits"), + "strReplace": g.newSimpleFuncType(stringType, "str", "from", "to"), + "asciiUpper": g.newSimpleFuncType(stringType, "str"), + "asciiLower": g.newSimpleFuncType(stringType, "str"), + "stringChars": g.newSimpleFuncType(stringType, "str"), + "format": g.newSimpleFuncType(stringType, "str", "vals"), + "isEmpty": g.newSimpleFuncType(boolType, "str"), + "equalsIgnoreCase": g.newSimpleFuncType(boolType, "str1", "str2"), // TODO(sbarzowski) Fix when they match the documentation "escapeStringBash": g.newSimpleFuncType(stringType, "str_"), "escapeStringDollars": g.newSimpleFuncType(stringType, "str_"), diff --git a/testdata/builtinEqualsIgnoreCase.golden b/testdata/builtinEqualsIgnoreCase.golden new file mode 100644 index 00000000..27ba77dd --- /dev/null +++ b/testdata/builtinEqualsIgnoreCase.golden @@ -0,0 +1 @@ +true diff --git a/testdata/builtinEqualsIgnoreCase.jsonnet b/testdata/builtinEqualsIgnoreCase.jsonnet new file mode 100644 index 00000000..059e086a --- /dev/null +++ b/testdata/builtinEqualsIgnoreCase.jsonnet @@ -0,0 +1 @@ +std.isEqualIgnoreCase("foo", "FOO") \ No newline at end of file diff --git a/testdata/builtinEqualsIgnoreCase.linter.golden b/testdata/builtinEqualsIgnoreCase.linter.golden new file mode 100644 index 00000000..e69de29b diff --git a/testdata/builtinEqualsIgnoreCase2.golden b/testdata/builtinEqualsIgnoreCase2.golden new file mode 100644 index 00000000..c508d536 --- /dev/null +++ b/testdata/builtinEqualsIgnoreCase2.golden @@ -0,0 +1 @@ +false diff --git a/testdata/builtinEqualsIgnoreCase2.jsonnet b/testdata/builtinEqualsIgnoreCase2.jsonnet new file mode 100644 index 00000000..f1bd4348 --- /dev/null +++ b/testdata/builtinEqualsIgnoreCase2.jsonnet @@ -0,0 +1 @@ +std.isEqualIgnoreCase("foo", "bar") \ No newline at end of file diff --git a/testdata/builtinEqualsIgnoreCase2.linter.golden b/testdata/builtinEqualsIgnoreCase2.linter.golden new file mode 100644 index 00000000..e69de29b