Factor out a toGNUCommandLine utility

... as suggested by @roberth
This commit is contained in:
Gabriel Gonzalez 2020-01-05 13:03:00 -08:00
parent 5edd4dd44c
commit 6d584c2614
2 changed files with 12 additions and 8 deletions

View file

@ -1,6 +1,7 @@
{ lib }:
{ /* Automatically convert an attribute set to command-line options.
rec {
/* 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.
@ -22,21 +23,24 @@
verbose = true;
};
=> " -X 'PUT' --data '{\"id\":0}' --retry '3' --url 'https://example.com/foo' --url 'https://example.com/bar' --verbose"
=> "'-X' 'PUT' '--data' '{\"id\":0}' '--retry' '3' '--url' 'https://example.com/foo' '--url' 'https://example.com/bar' '--verbose'"
*/
encodeGNUCommandLine =
options: attrs: lib.escapeShellArgs (toGNUCommandLine options attrs);
toGNUCommandLine =
{ renderKey ?
key: if builtins.stringLength key == 1 then "-${key}" else "--${key}"
, renderOption ?
key: value:
if value == null
then ""
else " ${renderKey key} ${lib.escapeShellArg value}"
then []
else [ (renderKey key) (builtins.toString value) ]
, renderBool ? key: value: if value then " ${renderKey key}" else ""
, renderBool ? key: value: lib.optional value (renderKey key)
, renderList ? key: value: lib.concatMapStrings (renderOption key) value
, renderList ? key: value: lib.concatMap (renderOption key) value
}:
options:
let
@ -48,5 +52,5 @@
else renderOption key value;
in
lib.concatStrings (lib.mapAttrsToList render options);
builtins.concatLists (lib.mapAttrsToList render options);
}

View file

@ -460,6 +460,6 @@ runTests {
verbose = true;
};
expected = " -X 'PUT' --data '{\"id\":0}' --retry '3' --url 'https://example.com/foo' --url 'https://example.com/bar' --verbose";
expected = "'-X' 'PUT' '--data' '{\"id\":0}' '--retry' '3' '--url' 'https://example.com/foo' '--url' 'https://example.com/bar' '--verbose'";
};
}