From 14b93071eca21c69b635bd77eb68057b2906ddab Mon Sep 17 00:00:00 2001 From: Klaus Aehlig Date: Mon, 22 Apr 2024 10:48:46 +0200 Subject: expressions: add "length" function Lists are somtimes used in configurations as replacement for tuples. Providing length gives an easy way to detect usage errors. --- src/buildtool/build_engine/expression/evaluator.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src') 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(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}, -- cgit v1.2.3