at function for objects

This commit is contained in:
pantor
2021-06-09 22:26:07 +02:00
parent b473873853
commit 4e909475ea
3 changed files with 10 additions and 1 deletions

View File

@@ -245,6 +245,9 @@ render("{{ float(\"1.8\") > 2 }}", data); // false
render("Hello {{ default(neighbour, \"my friend\") }}!", data); // "Hello Peter!"
render("Hello {{ default(colleague, \"my friend\") }}!", data); // "Hello my friend!"
// Access an objects value dynamically
render("{{ at(time, \"start\") }} to {{ time.end }}", data); // "16 to 22"
// Check if a key exists in an object
render("{{ exists(\"guests\") }}", data); // "true"
render("{{ exists(\"city\") }}", data); // "false"

View File

@@ -343,7 +343,11 @@ class Renderer : public NodeVisitor {
} break;
case Op::At: {
const auto args = get_arguments<2>(node);
json_eval_stack.push(&args[0]->at(args[1]->get<int>()));
if (args[0]->is_object()) {
json_eval_stack.push(&args[0]->at(args[1]->get<std::string>()));
} else {
json_eval_stack.push(&args[0]->at(args[1]->get<int>()));
}
} break;
case Op::Default: {
const auto test_arg = get_arguments<1, 0, false>(node)[0];

View File

@@ -70,6 +70,8 @@ TEST_CASE("functions") {
SUBCASE("at") {
CHECK(env.render("{{ at(names, 0) }}", data) == "Jeff");
CHECK(env.render("{{ at(names, i) }}", data) == "Seb");
CHECK(env.render("{{ at(brother, \"name\") }}", data) == "Chris");
CHECK(env.render("{{ at(at(brother, \"daughters\"), 0) }}", data) == "Maria");
// CHECK(env.render("{{ at(names, 45) }}", data) == "Jeff");
}