diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-03-01 18:52:20 +0100 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2022-03-02 14:55:40 +0100 |
commit | df8237044fcb583231323a7e2f9a7310cd80edf7 (patch) | |
tree | 54c49c319db8d0e6bce9b849ae73d58980fb17ff /src | |
parent | 57566d59dc01a259b4022696344215bb674ea89d (diff) | |
download | justbuild-df8237044fcb583231323a7e2f9a7310cd80edf7.tar.gz |
expression language: add a range function
Given a number or number representation, return a list of that
length consisting of representations of the lower numbers. In this
way, repeated non-pure actions can be generated (e.g., repetitions
of a test to detect flakyness).
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/expression/evaluator.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp index b93fa9f9..f1a19d4d 100644 --- a/src/buildtool/build_engine/expression/evaluator.cpp +++ b/src/buildtool/build_engine/expression/evaluator.cpp @@ -161,6 +161,22 @@ auto NubRight(ExpressionPtr const& expr) -> ExpressionPtr { return ExpressionPtr{reverse_result}; } +auto Range(ExpressionPtr const& expr) -> ExpressionPtr { + size_t len = 0; + if (expr->IsNumber() && expr->Number() > 0.0) { + len = static_cast<size_t>(std::lround(expr->Number())); + } + if (expr->IsString()) { + len = static_cast<size_t>(std::atol(expr->String().c_str())); + } + auto result = Expression::list_t{}; + result.reserve(len); + for (size_t i = 0; i < len; i++) { + result.emplace_back(ExpressionPtr{fmt::format("{}", i)}); + } + return ExpressionPtr{result}; +} + auto ChangeEndingTo(ExpressionPtr const& name, ExpressionPtr const& ending) -> ExpressionPtr { std::filesystem::path path{name->String()}; @@ -785,6 +801,7 @@ auto built_in_functions = {"+", AddExpr}, {"++", UnaryExpr(Flatten)}, {"nub_right", UnaryExpr(NubRight)}, + {"range", UnaryExpr(Range)}, {"change_ending", ChangeEndingExpr}, {"basename", UnaryExpr(BaseName)}, {"join", JoinExpr}, |