toGNUCommandLine
lib.cli.toGNUCommandLine
Nixpkgs manual
Automatically convert an attribute set to a list of command-line options.
toGNUCommandLine returns a list of string arguments.
Inputs
options-
How to format the arguments, see below.
attrs-
The attributes to transform into arguments.
Options
mkOptionName-
How to string-format the option name; By default one character is a short option (
-), more than one characters a long option (--). mkBool-
How to format a boolean value to a command list; By default it’s a flag option (only the option name if true, left out completely if false).
mkList-
How to format a list value to a command list; By default the option name is repeated for each value and
mkOptionis applied to the values themselves. mkOption-
How to format any remaining value to a command list; On the toplevel, booleans and lists are handled by
mkBoolandmkList, though they can still appear as values of a list. By default, everything is printed verbatim and complex types are forbidden (lists, attrsets, functions).nullvalues are omitted. optionValueSeparator-
How to separate an option from its flag; By default, there is no separator, so option
-cand value5would become["-c" "5"]. This is useful if the command requires equals, for example,-c=5.
Examples
lib.cli.toGNUCommandLine usage example
cli.toGNUCommandLine {} {
data = builtins.toJSON { id = 0; };
X = "PUT";
retry = 3;
retry-delay = null;
url = [ "https://example.com/foo" "https://example.com/bar" ];
silent = false;
verbose = true;
}
=> [
"-X" "PUT"
"--data" "{\"id\":0}"
"--retry" "3"
"--url" "https://example.com/foo"
"--url" "https://example.com/bar"
"--verbose"
]
Noogle detected
Implementation
The following is the current implementation of this function.
{
mkOptionName ? k: if stringLength k == 1 then "-${k}" else "--${k}",
mkBool ? k: v: optional v (mkOptionName k),
mkList ? k: concatMap (mkOption k),
mkOption ?
k: v:
if v == null then
[ ]
else if optionValueSeparator == null then
[
(mkOptionName k)
(mkValueString v)
]
else
[ "${mkOptionName k}${optionValueSeparator}${mkValueString v}" ],
optionValueSeparator ? null,
}:
let
render =
k: v:
if isBool v then
mkBool k v
else if isList v then
mkList k v
else
mkOption k v;
in
options: concatLists (mapAttrsToList render options)