From 693096d283763ce71fcd2002d965c07546aaafda Mon Sep 17 00:00:00 2001 From: Gabriel Gonzalez Date: Fri, 13 Dec 2019 18:25:52 -0800 Subject: [PATCH] Make behavior of `encodeGNUCommandLine` customizable ... based on feedback from @edolstra --- lib/cli.nix | 30 +++++++++++++++++------------- lib/tests/misc.nix | 1 + 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lib/cli.nix b/lib/cli.nix index 23fab8ec970..f3a81cb9e9c 100644 --- a/lib/cli.nix +++ b/lib/cli.nix @@ -6,27 +6,31 @@ boilerplate related to command-line construction for simple use cases. Example: - encodeGNUCommandLine { foo = "A"; bar = 1; baz = null; qux = true; v = true; } + encodeGNUCommandLine { } { foo = "A"; bar = 1; baz = null; qux = true; v = true; } => " --bar '1' --foo 'A' --qux -v" */ encodeGNUCommandLine = + { renderKey ? + key: if builtins.stringLength key == 1 then "-${key}" else "--${key}" + + , renderOption ? + key: value: + if value == null + then "" + else " ${renderKey key} ${lib.escapeShellArg value}" + + , renderBool ? key: value: if value then " ${renderKey key}" else "" + + , renderList ? key: value: lib.concatMapStrings renderOption value + }: 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 + then renderBool key value else if builtins.isList value - then lib.concatMapStrings renderOption value - else renderOption value; + then renderList key value + else renderOption key value; in lib.concatStrings (lib.mapAttrsToList render options); diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index c0a48f472cc..021d0e88c91 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -444,6 +444,7 @@ runTests { testRenderOptions = { expr = encodeGNUCommandLine + { } { foo = "A"; bar = 1;