mirror of
https://github.com/google/go-jsonnet.git
synced 2025-09-30 01:41:04 +02:00
feat: add builtin member go impl
This commit is contained in:
parent
b835910677
commit
c8492297df
42
builtins.go
42
builtins.go
@ -505,6 +505,47 @@ func builtinFilter(i *interpreter, funcv, arrv value) (value, error) {
|
|||||||
return makeValueArray(elems), nil
|
return makeValueArray(elems), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func rawMember(i *interpreter, arrv, value value) (bool, error) {
|
||||||
|
switch arrType := arrv.(type) {
|
||||||
|
case valueString:
|
||||||
|
valString, err := i.getString(value)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
for _, char := range arrType.getRunes() {
|
||||||
|
if string(char) == valString.getGoString() {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
case *valueArray:
|
||||||
|
for _, elem := range arrType.elements {
|
||||||
|
cachedThunkValue, err := elem.getValue(i)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
equal, err := rawEquals(i, cachedThunkValue, value)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if equal {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return false, i.Error("std.member first argument must be an array or a string")
|
||||||
|
}
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func builtinMember(i *interpreter, arrv, value value) (value, error) {
|
||||||
|
eq, err := rawMember(i, arrv, value)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return makeValueBoolean(eq), nil
|
||||||
|
}
|
||||||
|
|
||||||
type sortData struct {
|
type sortData struct {
|
||||||
err error
|
err error
|
||||||
i *interpreter
|
i *interpreter
|
||||||
@ -2042,6 +2083,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
|
|||||||
&binaryBuiltin{name: "filter", function: builtinFilter, params: ast.Identifiers{"func", "arr"}},
|
&binaryBuiltin{name: "filter", function: builtinFilter, params: ast.Identifiers{"func", "arr"}},
|
||||||
&ternaryBuiltin{name: "foldl", function: builtinFoldl, params: ast.Identifiers{"func", "arr", "init"}},
|
&ternaryBuiltin{name: "foldl", function: builtinFoldl, params: ast.Identifiers{"func", "arr", "init"}},
|
||||||
&ternaryBuiltin{name: "foldr", function: builtinFoldr, params: ast.Identifiers{"func", "arr", "init"}},
|
&ternaryBuiltin{name: "foldr", function: builtinFoldr, params: ast.Identifiers{"func", "arr", "init"}},
|
||||||
|
&binaryBuiltin{name: "member", function: builtinMember, params: ast.Identifiers{"arr", "x"}},
|
||||||
&binaryBuiltin{name: "range", function: builtinRange, params: ast.Identifiers{"from", "to"}},
|
&binaryBuiltin{name: "range", function: builtinRange, params: ast.Identifiers{"from", "to"}},
|
||||||
&binaryBuiltin{name: "primitiveEquals", function: primitiveEquals, params: ast.Identifiers{"x", "y"}},
|
&binaryBuiltin{name: "primitiveEquals", function: primitiveEquals, params: ast.Identifiers{"x", "y"}},
|
||||||
&binaryBuiltin{name: "equals", function: builtinEquals, params: ast.Identifiers{"x", "y"}},
|
&binaryBuiltin{name: "equals", function: builtinEquals, params: ast.Identifiers{"x", "y"}},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user