Skip to content

Commit 4bb6e38

Browse files
authored
feat: implement std.equalsIgnoreCase (#692)
1 parent 25d3372 commit 4bb6e38

8 files changed

+36
-18
lines changed

builtins.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,18 @@ func builtinIsEmpty(i *interpreter, strv value) (value, error) {
12891289
return makeValueBoolean(len(sStr) == 0), nil
12901290
}
12911291

1292+
func builtinEqualsIgnoreCase(i *interpreter, sv1, sv2 value) (value, error) {
1293+
s1, err := i.getString(sv1)
1294+
if err != nil {
1295+
return nil, err
1296+
}
1297+
s2, err := i.getString(sv2)
1298+
if err != nil {
1299+
return nil, err
1300+
}
1301+
return makeValueBoolean(strings.EqualFold(s1.getGoString(), s2.getGoString())), nil
1302+
}
1303+
12921304
func base64DecodeGoBytes(i *interpreter, str string) ([]byte, error) {
12931305
strLen := len(str)
12941306
if strLen%4 != 0 {
@@ -2358,6 +2370,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
23582370
&ternaryBuiltin{name: "splitLimit", function: builtinSplitLimit, params: ast.Identifiers{"str", "c", "maxsplits"}},
23592371
&ternaryBuiltin{name: "strReplace", function: builtinStrReplace, params: ast.Identifiers{"str", "from", "to"}},
23602372
&unaryBuiltin{name: "isEmpty", function: builtinIsEmpty, params: ast.Identifiers{"str"}},
2373+
&binaryBuiltin{name: "equalsIgnoreCase", function: builtinEqualsIgnoreCase, params: ast.Identifiers{"str1", "str2"}},
23612374
&unaryBuiltin{name: "base64Decode", function: builtinBase64Decode, params: ast.Identifiers{"str"}},
23622375
&unaryBuiltin{name: "base64DecodeBytes", function: builtinBase64DecodeBytes, params: ast.Identifiers{"str"}},
23632376
&unaryBuiltin{name: "parseInt", function: builtinParseInt, params: ast.Identifiers{"str"}},

linter/internal/types/stdlib.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -72,24 +72,25 @@ func prepareStdlib(g *typeGraph) {
7272

7373
// String Manipulation
7474

75-
"toString": g.newSimpleFuncType(stringType, "a"),
76-
"codepoint": g.newSimpleFuncType(numberType, "str"),
77-
"char": g.newSimpleFuncType(stringType, "n"),
78-
"substr": g.newSimpleFuncType(stringType, "str", "from", "len"),
79-
"findSubstr": g.newSimpleFuncType(numberArrayType, "pat", "str"),
80-
"startsWith": g.newSimpleFuncType(boolType, "a", "b"),
81-
"endsWith": g.newSimpleFuncType(boolType, "a", "b"),
82-
"stripChars": g.newSimpleFuncType(stringType, "str", "chars"),
83-
"lstripChars": g.newSimpleFuncType(stringType, "str", "chars"),
84-
"rstripChars": g.newSimpleFuncType(stringType, "str", "chars"),
85-
"split": g.newSimpleFuncType(arrayOfString, "str", "c"),
86-
"splitLimit": g.newSimpleFuncType(arrayOfString, "str", "c", "maxsplits"),
87-
"strReplace": g.newSimpleFuncType(stringType, "str", "from", "to"),
88-
"asciiUpper": g.newSimpleFuncType(stringType, "str"),
89-
"asciiLower": g.newSimpleFuncType(stringType, "str"),
90-
"stringChars": g.newSimpleFuncType(stringType, "str"),
91-
"format": g.newSimpleFuncType(stringType, "str", "vals"),
92-
"isEmpty": g.newSimpleFuncType(boolType, "str"),
75+
"toString": g.newSimpleFuncType(stringType, "a"),
76+
"codepoint": g.newSimpleFuncType(numberType, "str"),
77+
"char": g.newSimpleFuncType(stringType, "n"),
78+
"substr": g.newSimpleFuncType(stringType, "str", "from", "len"),
79+
"findSubstr": g.newSimpleFuncType(numberArrayType, "pat", "str"),
80+
"startsWith": g.newSimpleFuncType(boolType, "a", "b"),
81+
"endsWith": g.newSimpleFuncType(boolType, "a", "b"),
82+
"stripChars": g.newSimpleFuncType(stringType, "str", "chars"),
83+
"lstripChars": g.newSimpleFuncType(stringType, "str", "chars"),
84+
"rstripChars": g.newSimpleFuncType(stringType, "str", "chars"),
85+
"split": g.newSimpleFuncType(arrayOfString, "str", "c"),
86+
"splitLimit": g.newSimpleFuncType(arrayOfString, "str", "c", "maxsplits"),
87+
"strReplace": g.newSimpleFuncType(stringType, "str", "from", "to"),
88+
"asciiUpper": g.newSimpleFuncType(stringType, "str"),
89+
"asciiLower": g.newSimpleFuncType(stringType, "str"),
90+
"stringChars": g.newSimpleFuncType(stringType, "str"),
91+
"format": g.newSimpleFuncType(stringType, "str", "vals"),
92+
"isEmpty": g.newSimpleFuncType(boolType, "str"),
93+
"equalsIgnoreCase": g.newSimpleFuncType(boolType, "str1", "str2"),
9394
// TODO(sbarzowski) Fix when they match the documentation
9495
"escapeStringBash": g.newSimpleFuncType(stringType, "str_"),
9596
"escapeStringDollars": g.newSimpleFuncType(stringType, "str_"),
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.equalsIgnoreCase("foo", "FOO")

testdata/builtinEqualsIgnoreCase.linter.golden

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
false
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.equalsIgnoreCase("foo", "bar")

testdata/builtinEqualsIgnoreCase2.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)