 7228a3c0bc
			
		
	
	
		7228a3c0bc
		
	
	
	
	
		
			
			Let’s call them by what they are, option names. `generators.mkValueStringDefault` is a better value string renderer than plain `toString`. Also add docs to all options.
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { lib }:
 | ||
| 
 | ||
| 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.
 | ||
| 
 | ||
|      `toGNUCommandLine` returns a list of nix strings.
 | ||
|      `toGNUCommandLineShell` returns an escaped shell string.
 | ||
| 
 | ||
|      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"
 | ||
|        ]
 | ||
| 
 | ||
|        cli.toGNUCommandLineShell {} {
 | ||
|          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'";
 | ||
|   */
 | ||
|   toGNUCommandLineShell =
 | ||
|     options: attrs: lib.escapeShellArgs (toGNUCommandLine options attrs);
 | ||
| 
 | ||
|   toGNUCommandLine = {
 | ||
|     # how to string-format the option name;
 | ||
|     # by default one character is a short option (`-`),
 | ||
|     # more than one characters a long option (`--`).
 | ||
|     mkOptionName ?
 | ||
|       k: if builtins.stringLength k == 1
 | ||
|           then "-${k}"
 | ||
|           else "--${k}",
 | ||
| 
 | ||
|     # 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).
 | ||
|     mkBool ? k: v: lib.optional v (mkOptionName k),
 | ||
| 
 | ||
|     # how to format a list value to a command list;
 | ||
|     # by default the option name is repeated for each value
 | ||
|     # and `mkOption` is applied to the values themselves.
 | ||
|     mkList ? k: v: lib.concatMap (mkOption k) v,
 | ||
| 
 | ||
|     # how to format any remaining value to a command list;
 | ||
|     # on the toplevel, booleans and lists are handled by `mkBool` and `mkList`,
 | ||
|     # though they can still appear as values of a list.
 | ||
|     # By default, everything is printed verbatim and complex types
 | ||
|     # are forbidden (lists, attrsets, functions). `null` values are omitted.
 | ||
|     mkOption ?
 | ||
|       k: v: if v == null
 | ||
|             then []
 | ||
|             else [ (mkOptionName k) (lib.generators.mkValueStringDefault {} v) ]
 | ||
|     }:
 | ||
|     options:
 | ||
|       let
 | ||
|         render = k: v:
 | ||
|           if      builtins.isBool v then mkBool k v
 | ||
|           else if builtins.isList v then mkList k v
 | ||
|           else mkOption k v;
 | ||
| 
 | ||
|       in
 | ||
|         builtins.concatLists (lib.mapAttrsToList render options);
 | ||
| }
 |