diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-04-22 10:48:46 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-04-24 12:30:09 +0200 |
commit | 14b93071eca21c69b635bd77eb68057b2906ddab (patch) | |
tree | 324d82d99e9015239f548acf17e1e9373af1f65a /src | |
parent | 199487b5ba387653bbec36d6dcea85819c90994c (diff) | |
download | justbuild-14b93071eca21c69b635bd77eb68057b2906ddab.tar.gz |
expressions: add "length" function
Lists are somtimes used in configurations as replacement for tuples.
Providing length gives an easy way to detect usage errors.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/expression/evaluator.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp index f91e5b13..11299bb5 100644 --- a/src/buildtool/build_engine/expression/evaluator.cpp +++ b/src/buildtool/build_engine/expression/evaluator.cpp @@ -232,6 +232,15 @@ auto Reverse(ExpressionPtr const& expr) -> ExpressionPtr { return ExpressionPtr{reverse_result}; } +auto Length(ExpressionPtr const& expr) -> ExpressionPtr { + if (not expr->IsList()) { + throw Evaluator::EvaluationError{fmt::format( + "length expects list but instead got: {}.", expr->ToString())}; + } + return ExpressionPtr{ + static_cast<Expression::number_t>(expr->List().size())}; +} + auto NubRight(ExpressionPtr const& expr) -> ExpressionPtr { if (not expr->IsList()) { throw Evaluator::EvaluationError{fmt::format( @@ -1098,6 +1107,7 @@ auto const kBuiltInFunctions = {"enumerate", UnaryExpr(Enumerate)}, {"set", UnaryExpr(Set)}, {"reverse", UnaryExpr(Reverse)}, + {"length", UnaryExpr(Length)}, {"values", UnaryExpr(Values)}, {"lookup", LookupExpr}, {"[]", ArrayAccessExpr}, |