summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKlaus Aehlig <klaus.aehlig@huawei.com>2024-04-16 16:07:21 +0200
committerKlaus Aehlig <klaus.aehlig@huawei.com>2024-04-16 18:10:54 +0200
commit4dc2cafb17c2dbdb58ada3a200e843a894bfc113 (patch)
tree88b45f8caaf22b3ed0bec8727b7f7b164b2dc24a /src
parent2c362dc379217da3c213b4698543ddfe4b7bd9cf (diff)
downloadjustbuild-4dc2cafb17c2dbdb58ada3a200e843a894bfc113.tar.gz
expression language: add array access by index
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/expression/evaluator.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp
index 93e9836a..b8102e95 100644
--- a/src/buildtool/build_engine/expression/evaluator.cpp
+++ b/src/buildtool/build_engine/expression/evaluator.cpp
@@ -664,6 +664,32 @@ auto LookupExpr(SubExprEvaluator&& eval,
return lookup;
}
+auto ArrayAccessExpr(SubExprEvaluator&& eval,
+ ExpressionPtr const& expr,
+ Configuration const& env) -> ExpressionPtr {
+ auto k = eval(expr["index"], env);
+ auto d = eval(expr["list"], env);
+ if (not d->IsList()) {
+ throw Evaluator::EvaluationError{fmt::format(
+ "List expected to be list, but found {}.", d->ToString())};
+ }
+ auto len = static_cast<int64_t>(d->List().size());
+ int64_t index = 0;
+ if (k->IsNumber()) {
+ index = static_cast<int64_t>(std::lround(k->Number()));
+ }
+ if (k->IsString()) {
+ index = std::atol(k->String().c_str());
+ }
+ if (0 <= index and index < len) {
+ return d->List()[static_cast<std::size_t>(index)];
+ }
+ if (index < 0 and len + index >= 0) {
+ return d->List()[static_cast<std::size_t>(len + index)];
+ }
+ return eval(expr->Get("default", Expression::none_t()), env);
+}
+
auto EmptyMapExpr(SubExprEvaluator&& /*eval*/,
ExpressionPtr const& /*expr*/,
Configuration const&
@@ -1053,6 +1079,7 @@ auto const kBuiltInFunctions =
{"reverse", UnaryExpr(Reverse)},
{"values", UnaryExpr(Values)},
{"lookup", LookupExpr},
+ {"[]", ArrayAccessExpr},
{"empty_map", EmptyMapExpr},
{"singleton_map", SingletonMapExpr},
{"disjoint_map_union", DisjointUnionExpr},