diff --git a/src/libcmd/common-eval-args.cc b/src/libcmd/common-eval-args.cc index 89df67406..b87bbbc27 100644 --- a/src/libcmd/common-eval-args.cc +++ b/src/libcmd/common-eval-args.cc @@ -40,6 +40,14 @@ MixEvalArgs::MixEvalArgs() .completer = completePath }); + addFlag({ + .longName = "arg-from-stdin", + .description = "Pass the contents of stdin as the argument *name* to Nix functions.", + .category = category, + .labels = {"name"}, + .handler = {[&](std::string name) { autoArgs.insert_or_assign(name, AutoArg{AutoArgStdin{}}); }}, + }); + addFlag({ .longName = "include", .shortName = 'I', @@ -174,6 +182,9 @@ Bindings * MixEvalArgs::getAutoArgs(EvalState & state) }, [&](const AutoArgFile & arg) { v->mkString(readFile(arg.path)); + }, + [&](const AutoArgStdin & arg) { + v->mkString(readFile(STDIN_FILENO)); } }, arg); res.insert(state.symbols.create(name), v); diff --git a/src/libcmd/common-eval-args.hh b/src/libcmd/common-eval-args.hh index 9f4da4231..7548bd3b7 100644 --- a/src/libcmd/common-eval-args.hh +++ b/src/libcmd/common-eval-args.hh @@ -29,8 +29,9 @@ private: struct AutoArgExpr { std::string expr; }; struct AutoArgString { std::string s; }; struct AutoArgFile { std::filesystem::path path; }; + struct AutoArgStdin { }; - using AutoArg = std::variant; + using AutoArg = std::variant; std::map autoArgs; }; diff --git a/tests/functional/eval.sh b/tests/functional/eval.sh index 321593670..c6a475cd0 100644 --- a/tests/functional/eval.sh +++ b/tests/functional/eval.sh @@ -49,3 +49,6 @@ printf 123 > $TEST_ROOT/xyzzy/default.nix if [[ -e /proc/version ]]; then [[ "$(nix eval --raw --arg-from-file foo /proc/version --expr '{ foo }: { inherit foo; }' foo)" = "$(cat /proc/version)" ]] fi + +# Test --arg-from-stdin. +[[ "$(echo bla | nix eval --raw --arg-from-stdin foo --expr '{ foo }: { inherit foo; }' foo)" = bla ]]