From c5d21b36c5253bcfb2df2ad289ba85cfcdae6c83 Mon Sep 17 00:00:00 2001 From: Maximilian Bosch Date: Sun, 4 Jan 2026 22:58:29 +0100 Subject: [PATCH] libcmd: turn autoArgs into a map that points to std::variant This is a little more elegant and easier to reason about than prefixing strings with whatever type the rest of the string is. Change-Id: I7769535303dcb9f67b79e89bef162beec990e2a0 --- lix/libcmd/common-eval-args.cc | 21 ++++++++++++++------- lix/libcmd/common-eval-args.hh | 11 ++++++++++- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lix/libcmd/common-eval-args.cc b/lix/libcmd/common-eval-args.cc index f6ac3ad48..65a998549 100644 --- a/lix/libcmd/common-eval-args.cc +++ b/lix/libcmd/common-eval-args.cc @@ -44,7 +44,7 @@ MixEvalArgs::MixEvalArgs() .labels = {"name", "expr"}, .handler = {[&](std::string name, std::string expr) { checkValidNixIdentifier(name); - autoArgs[name] = 'E' + expr; + autoArgs[name] = ExprArgument(expr); }}} ); @@ -55,7 +55,7 @@ MixEvalArgs::MixEvalArgs() .labels = {"name", "string"}, .handler = {[&](std::string name, std::string s) { checkValidNixIdentifier(name); - autoArgs[name] = 'S' + s; + autoArgs[name] = StringArgument(s); }}, }); @@ -182,11 +182,18 @@ MixEvalArgs::MixEvalArgs() Bindings * MixEvalArgs::getAutoArgs(Evaluator & state) { auto res = state.buildBindings(autoArgs.size()); - for (auto & i : autoArgs) { - Value v = i.second[0] == 'E' - ? state.evalLazily(state.parseExprFromString(i.second.substr(1), CanonPath::fromCwd())) - : Value{NewValueAs::string, ((std::string_view) i.second).substr(1)}; - res.insert(state.symbols.create(i.first), v); + for (auto & [name, value] : autoArgs) { + Value v = std::visit( + overloaded{ + [&](StringArgument & str) -> Value { return {NewValueAs::string, (std::string_view) str.value}; }, + [&](ExprArgument & e) -> Value { + return state.evalLazily(state.parseExprFromString(e.expr, CanonPath::fromCwd())); + } + }, + value + ); + + res.insert(state.symbols.create(name), v); } return res.finish(); } diff --git a/lix/libcmd/common-eval-args.hh b/lix/libcmd/common-eval-args.hh index 5403dafc1..1e002d99c 100644 --- a/lix/libcmd/common-eval-args.hh +++ b/lix/libcmd/common-eval-args.hh @@ -14,6 +14,15 @@ class EvalState; class Bindings; struct SourcePath; +struct StringArgument +{ + std::string value; +}; +struct ExprArgument +{ + std::string expr; +}; + struct MixEvalArgs : virtual Args, virtual MixRepair { static constexpr auto category = "Common evaluation options"; @@ -27,7 +36,7 @@ struct MixEvalArgs : virtual Args, virtual MixRepair std::optional evalStoreUrl; private: - std::map autoArgs; + std::map> autoArgs; }; /** @brief Resolve an argument that is generally a file, but could be something that