forked from lix-project/lix
nix eval: Add --apply flag for post-processing the result
This commit is contained in:
parent
5332c439d0
commit
2e4bd78211
|
@ -12,10 +12,18 @@ using namespace nix;
|
||||||
struct CmdEval : MixJSON, InstallableCommand
|
struct CmdEval : MixJSON, InstallableCommand
|
||||||
{
|
{
|
||||||
bool raw = false;
|
bool raw = false;
|
||||||
|
std::optional<std::string> apply;
|
||||||
|
|
||||||
CmdEval()
|
CmdEval()
|
||||||
{
|
{
|
||||||
mkFlag(0, "raw", "print strings unquoted", &raw);
|
mkFlag(0, "raw", "print strings unquoted", &raw);
|
||||||
|
|
||||||
|
addFlag({
|
||||||
|
.longName = "apply",
|
||||||
|
.description = "apply a function to each argument",
|
||||||
|
.labels = {"expr"},
|
||||||
|
.handler = {&apply},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string description() override
|
std::string description() override
|
||||||
|
@ -26,21 +34,25 @@ struct CmdEval : MixJSON, InstallableCommand
|
||||||
Examples examples() override
|
Examples examples() override
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
Example{
|
{
|
||||||
"To evaluate a Nix expression given on the command line:",
|
"To evaluate a Nix expression given on the command line:",
|
||||||
"nix eval --expr '1 + 2'"
|
"nix eval --expr '1 + 2'"
|
||||||
},
|
},
|
||||||
Example{
|
{
|
||||||
"To evaluate a Nix expression from a file or URI:",
|
"To evaluate a Nix expression from a file or URI:",
|
||||||
"nix eval -f channel:nixos-17.09 hello.name"
|
"nix eval -f ./my-nixpkgs hello.name"
|
||||||
},
|
},
|
||||||
Example{
|
{
|
||||||
"To get the current version of Nixpkgs:",
|
"To get the current version of Nixpkgs:",
|
||||||
"nix eval --raw nixpkgs.lib.version"
|
"nix eval --raw nixpkgs#lib.version"
|
||||||
},
|
},
|
||||||
Example{
|
{
|
||||||
"To print the store path of the Hello package:",
|
"To print the store path of the Hello package:",
|
||||||
"nix eval --raw nixpkgs.hello"
|
"nix eval --raw nixpkgs#hello"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"To get a list of checks in the 'nix' flake:",
|
||||||
|
"nix eval nix#checks.x86_64-linux --apply builtins.attrNames"
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -57,6 +69,14 @@ struct CmdEval : MixJSON, InstallableCommand
|
||||||
auto v = installable->toValue(*state).first;
|
auto v = installable->toValue(*state).first;
|
||||||
PathSet context;
|
PathSet context;
|
||||||
|
|
||||||
|
if (apply) {
|
||||||
|
auto vApply = state->allocValue();
|
||||||
|
state->eval(state->parseExprFromString(*apply, absPath(".")), *vApply);
|
||||||
|
auto vRes = state->allocValue();
|
||||||
|
state->callFunction(*vApply, *v, *vRes, noPos);
|
||||||
|
v = vRes;
|
||||||
|
}
|
||||||
|
|
||||||
if (raw) {
|
if (raw) {
|
||||||
stopProgressBar();
|
stopProgressBar();
|
||||||
std::cout << state->coerceToString(noPos, *v, context);
|
std::cout << state->coerceToString(noPos, *v, context);
|
||||||
|
|
Loading…
Reference in a new issue