From 871d462e28ae705756d3d628efabe520da0b99e5 Mon Sep 17 00:00:00 2001 From: Carl Verge Date: Tue, 19 Mar 2024 06:32:26 -0700 Subject: [PATCH] implement std.get function (#202) --- sjsonnet/src/sjsonnet/Std.scala | 14 +++++++++++++- .../test/src/sjsonnet/Std0150FunctionsTests.scala | 8 ++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/sjsonnet/src/sjsonnet/Std.scala b/sjsonnet/src/sjsonnet/Std.scala index 2ec01b38..d47e1b07 100644 --- a/sjsonnet/src/sjsonnet/Std.scala +++ b/sjsonnet/src/sjsonnet/Std.scala @@ -1227,7 +1227,19 @@ class Std { "asciiUpper" -> AsciiUpper, "asciiLower" -> AsciiLower, "trace" -> Trace, - "extVar" -> ExtVar + "extVar" -> ExtVar, + builtinWithDefaults("get", "o" -> null, "f" -> null, "default" -> Val.Null(dummyPos), "inc_hidden" -> Val.True(dummyPos)) { (args, pos, ev) => + val obj = args(0).asObj + val k = args(1).asString + val incHidden = args(3).asBoolean + if (incHidden && obj.containsKey(k)) { + obj.value(k, pos.noOffset, obj)(ev) + } else if (!incHidden && obj.containsVisibleKey(k)) { + obj.value(k, pos.noOffset, obj)(ev) + } else { + args(2) + } + } ) val Std = Val.Obj.mk( null, diff --git a/sjsonnet/test/src/sjsonnet/Std0150FunctionsTests.scala b/sjsonnet/test/src/sjsonnet/Std0150FunctionsTests.scala index a8e1cc79..26234a8c 100644 --- a/sjsonnet/test/src/sjsonnet/Std0150FunctionsTests.scala +++ b/sjsonnet/test/src/sjsonnet/Std0150FunctionsTests.scala @@ -158,5 +158,13 @@ object Std0150FunctionsTests extends TestSuite { eval("""std.reverse([1])""") ==> ujson.Arr(1) eval("""std.reverse(["1", true, null])""") ==> ujson.Arr(ujson.Null, true, "1") } + + test("get"){ + eval("""std.get({a: 1}, "a")""") ==> ujson.Num(1) + eval("""std.get({a:: 1}, "a")""") ==> ujson.Num(1) + eval("""std.get({a: 1}, "b")""") ==> ujson.Null + eval("""std.get({a: 1}, "b", default=2)""") ==> ujson.Num(2) + eval("""std.get({a:: 1}, "a", inc_hidden=false)""") ==> ujson.Null + } } }