diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/buildtool/build_engine/expression/configuration.hpp | 4 | ||||
-rw-r--r-- | src/buildtool/build_engine/expression/evaluator.cpp | 23 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/buildtool/build_engine/expression/configuration.hpp b/src/buildtool/build_engine/expression/configuration.hpp index c19baa01..e08a35d0 100644 --- a/src/buildtool/build_engine/expression/configuration.hpp +++ b/src/buildtool/build_engine/expression/configuration.hpp @@ -137,6 +137,10 @@ class Configuration { return expr_->Map().Find(x).has_value(); } + [[nodiscard]] auto Expr() const& -> ExpressionPtr const& { return expr_; } + + [[nodiscard]] auto Expr() && -> ExpressionPtr { return std::move(expr_); } + private: ExpressionPtr expr_{Expression::kEmptyMap}; }; diff --git a/src/buildtool/build_engine/expression/evaluator.cpp b/src/buildtool/build_engine/expression/evaluator.cpp index af5d46ed..f7882342 100644 --- a/src/buildtool/build_engine/expression/evaluator.cpp +++ b/src/buildtool/build_engine/expression/evaluator.cpp @@ -776,6 +776,28 @@ auto LetExpr(SubExprEvaluator&& eval, } } +auto EnvExpr(SubExprEvaluator&& /*eval*/, + ExpressionPtr const& expr, + Configuration const& env) -> ExpressionPtr { + if (auto const& vars = expr->At("vars")) { + if (not vars->get()->IsList()) { + throw Evaluator::EvaluationError{fmt::format( + "vars in env has to be a list of strings, but found {}", + vars->get()->ToString())}; + } + for (const auto& var : vars->get()->List()) { + if (not var->IsString()) { + throw Evaluator::EvaluationError{ + fmt::format("vars in env has to be a list of strings, " + "but found entry {}", + var->ToString())}; + } + } + return env.Prune(vars->get()).Expr(); + } + return Expression::kEmptyMap; +} + auto ConcatTargetNameExpr(SubExprEvaluator&& eval, ExpressionPtr const& expr, Configuration const& env) -> ExpressionPtr { @@ -906,6 +928,7 @@ auto const kBuiltInFunctions = {"foreach_map", ForeachMapExpr}, {"foldl", FoldLeftExpr}, {"let*", LetExpr}, + {"env", EnvExpr}, {"concat_target_name", ConcatTargetNameExpr}}); } // namespace |