summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/build_engine/expression/configuration.hpp4
-rw-r--r--src/buildtool/build_engine/expression/evaluator.cpp23
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