aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-06-04 22:35:43 +0200
committerEelco Dolstra <edolstra@gmail.com>2019-06-04 22:35:43 +0200
commit1b057929885fd3f339d4c85b44ad9f10fef7d8a9 (patch)
tree5c4ed115515cb07103f756ba4fdc07f4491f96fc /src
parentce225615c3ee08b7b63a8488dbf74ff2598d8d74 (diff)
Shorter syntax for referencing flake outputs
Fixes #2819.
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/primops/flake.cc16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/libexpr/primops/flake.cc b/src/libexpr/primops/flake.cc
index 734f650f2..793d6da35 100644
--- a/src/libexpr/primops/flake.cc
+++ b/src/libexpr/primops/flake.cc
@@ -468,10 +468,12 @@ static void prim_callNonFlake(EvalState & state, const Pos & pos, Value * * args
void callFlake(EvalState & state,
const Flake & flake,
const FlakeInputs & inputs,
- Value & v)
+ Value & vRes)
{
- // Construct the resulting attrset '{description, outputs,
- // ...}'. This attrset is passed lazily as an argument to 'outputs'.
+ // Construct the resulting attrset '{outputs, ...}'. This attrset
+ // is passed lazily as an argument to the 'outputs' function.
+
+ auto & v = *state.allocValue();
state.mkAttrs(v,
inputs.flakeInputs.size() +
@@ -513,6 +515,14 @@ void callFlake(EvalState & state,
v.attrs->push_back(Attr(state.symbols.create("self"), &v));
v.attrs->sort();
+
+ /* For convenience, put the outputs directly in the result, so you
+ can refer to an output of an input as 'inputs.foo.bar' rather
+ than 'inputs.foo.outputs.bar'. */
+ auto v2 = *state.allocValue();
+ state.eval(state.parseExprFromString("res: res.outputs // res", "/"), v2);
+
+ state.callFunction(v2, v, vRes, noPos);
}
void callFlake(EvalState & state,