Skip to content

Commit 3c7c0cb

Browse files
authored
feat: implement objectRemoveKey (#686)
1 parent 868d9c6 commit 3c7c0cb

File tree

5 files changed

+45
-0
lines changed

5 files changed

+45
-0
lines changed

builtins.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1990,6 +1990,41 @@ func builtinContains(i *interpreter, arrv value, ev value) (value, error) {
19901990
return makeValueBoolean(false), nil
19911991
}
19921992

1993+
func builtInObjectRemoveKey(i *interpreter, objv value, keyv value) (value, error) {
1994+
obj, err := i.getObject(objv)
1995+
if err != nil {
1996+
return nil, err
1997+
}
1998+
key, err := i.getString(keyv)
1999+
if err != nil {
2000+
return nil, err
2001+
}
2002+
2003+
newFields := make(simpleObjectFieldMap)
2004+
simpleObj := obj.uncached.(*simpleObject)
2005+
for fieldName, fieldVal := range simpleObj.fields {
2006+
if fieldName == key.getGoString() {
2007+
// skip the field which needs to be deleted
2008+
continue
2009+
}
2010+
2011+
newFields[fieldName] = simpleObjectField{
2012+
hide: fieldVal.hide,
2013+
field: &bindingsUnboundField{
2014+
inner: fieldVal.field,
2015+
bindings: simpleObj.upValues,
2016+
},
2017+
}
2018+
}
2019+
2020+
return makeValueSimpleObject(
2021+
nil,
2022+
newFields,
2023+
[]unboundField{}, // No asserts allowed
2024+
nil,
2025+
), nil
2026+
}
2027+
19932028
// Utils for builtins - TODO(sbarzowski) move to a separate file in another commit
19942029

19952030
type builtin interface {
@@ -2256,6 +2291,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
22562291
&binaryBuiltin{name: "equals", function: builtinEquals, params: ast.Identifiers{"x", "y"}},
22572292
&binaryBuiltin{name: "objectFieldsEx", function: builtinObjectFieldsEx, params: ast.Identifiers{"obj", "hidden"}},
22582293
&ternaryBuiltin{name: "objectHasEx", function: builtinObjectHasEx, params: ast.Identifiers{"obj", "fname", "hidden"}},
2294+
&binaryBuiltin{name: "objectRemoveKey", function: builtInObjectRemoveKey, params: ast.Identifiers{"obj", "key"}},
22592295
&unaryBuiltin{name: "type", function: builtinType, params: ast.Identifiers{"x"}},
22602296
&unaryBuiltin{name: "char", function: builtinChar, params: ast.Identifiers{"n"}},
22612297
&unaryBuiltin{name: "codepoint", function: builtinCodepoint, params: ast.Identifiers{"str"}},

linter/internal/types/stdlib.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ func prepareStdlib(g *typeGraph) {
151151
"setDiff": g.newFuncType(anyArrayType, []ast.Parameter{required("a"), required("b"), optional("keyF")}),
152152
"setMember": g.newFuncType(boolType, []ast.Parameter{required("x"), required("arr"), optional("keyF")}),
153153

154+
// Objects
155+
156+
"objectRemoveKey": g.newSimpleFuncType(anyObjectType, "obj", "key"),
157+
154158
// Encoding
155159

156160
"base64": g.newSimpleFuncType(stringType, "input"),
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"bar": 2,
3+
"baz": 3
4+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
std.objectRemoveKey({foo: 1, bar: 2, baz: 3}, "foo")

testdata/builtinObjectRemoveKey.linter.golden

Whitespace-only changes.

0 commit comments

Comments
 (0)