diff options
author | Gabriel Gonzalez <Gabriel439@gmail.com> | 2019-12-11 16:30:05 -0800 |
---|---|---|
committer | Gabriel Gonzalez <Gabriel439@gmail.com> | 2019-12-11 16:30:05 -0800 |
commit | 183a99734f666b6bd508f4c81e887dbc746fec69 (patch) | |
tree | 5ac296649a3555d5f27a1155cf546d110e11ff6c /lib/cli.nix | |
parent | 98e57f8999cc88e3d4b2250adef51747ade5105e (diff) |
Add `pkgs.lib.renderOptions`
This adds a new utility to intelligently convert Nix records to command line options to reduce boilerplate for simple use cases and to also reduce the likelihood of malformed command lines
Diffstat (limited to 'lib/cli.nix')
-rw-r--r-- | lib/cli.nix | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/cli.nix b/lib/cli.nix new file mode 100644 index 0000000000000..d794778b21a4f --- /dev/null +++ b/lib/cli.nix @@ -0,0 +1,33 @@ +{ lib }: + +{ /* Automatically convert an attribute set to command-line options. + + This helps protect against malformed command lines and also to reduce + boilerplate related to command-line construction for simple use cases. + + Example: + renderOptions { foo = "A"; bar = 1; baz = null; qux = true; v = true; } + => " --bar '1' --foo 'A' --qux -v" + */ + renderOptions = + options: + let + render = key: value: + let + hyphenate = + k: if builtins.stringLength k == 1 then "-${k}" else "--${k}"; + + renderOption = v: if v == null then "" else " ${hyphenate key} ${lib.escapeShellArg v}"; + + renderSwitch = if value then " ${hyphenate key}" else ""; + + in + if builtins.isBool value + then renderSwitch + else if builtins.isList value + then lib.concatMapStrings renderOption value + else renderOption value; + + in + lib.concatStrings (lib.mapAttrsToList render options); +} |