Build shell commands from Nix attribute sets.
exec :: AttrSet -> AttrSet
exec transforms a nested attribute set <input> into a flat attribute set <output>.
For each attribute <attr> of <input> at the attribute path <root> . [...] . <attr> that evaluates to a derivation, it creates an attribute <root> in <output>.
All other attribute paths are ignored.
Example
{ lib, attr-cmd }: let input = { a.b.c = drv; d.e.f = drv'; g.h.i = "ignored"; }; output = attr-cmd.exec input; in { inherit = output; executable = lib.getExe output.a; }{ output = { a = drv''; d = drv'''; }; executable = "/nix/store/...-a/bin/a"}
Each attribute <root> in <output> is a derivation that produces an executable /bin/<root>.
Such an executable <root> accepts command line words that correspond to attribute paths in <attrs-in> starting from <root>.
The final command line word <attr> executes the meta.mainProgram (or /bin/<attr>) from the derivation's bin (or out) output at the corresponding attribute <attr> from <input>.
After adding the derivations from <output> to the environment, run the executable <attr> by specifying its attribute path as command line arguments:
<root> ... <attr> [<arguments>]...Help will be shown for intermediate subcommands, displaying meta.description on a derivation or attribute set if available.
Example
Declare a nested attribute set
foowith a derivationbazas a leaf attribute, and pass that attribute set toattr-cmd:# ./default.nix { sources ? import ./npins, system ? builtins.currentSystem, pkgs ? import sources.nixpkgs { inherit system; config = { }; overlays = [ ]; }, attr-cmd ? pkgs.callPackage "${sources.attr-cmd}/lib.nix" {}; }: let lib = pkgs.lib // attr-cmd.lib lib rec { foo.bar.baz = pkgs.writeScriptBin "baz" "echo success $@"; commands = lib.attr-cmd.exec { inherit foo; }; ; shell = pkgs.mkShellNoCC { packages = builtins.attrValues commands ++ [ pkgs.npins ]; }; }The values of the resulting attribute set
commandsare now derivations that create executables:$ nix-shell -p npins --run "npins init" $ nix-shell [nix-shell:~]$ foo bar baz success [nix-shell:~]$ foo bar baz or else success or else