diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-04-16 16:07:21 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-04-16 18:10:54 +0200 |
commit | 4dc2cafb17c2dbdb58ada3a200e843a894bfc113 (patch) | |
tree | 88b45f8caaf22b3ed0bec8727b7f7b164b2dc24a /src | |
parent | 2c362dc379217da3c213b4698543ddfe4b7bd9cf (diff) | |
download | justbuild-4dc2cafb17c2dbdb58ada3a200e843a894bfc113.tar.gz |
expression language: add array access by index
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/expression/evaluator.cpp | 27 |
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}, |