hydrogen-cli-args
=================
[](https://travis-ci.org/scravy/hydrogen-cli-args)
An easy to use command line arguments parser.
main = do
(options, switches, args) <- getOpts [
'V' ~: switch "version"
, 'h' ~: switch "help"
, optarg "inFile"
, optarg "outFile"
, 'v' ~: switch "verbose"
, 'f' ~: optarg "flag"
, 'D' ~: optarg "config"
]
when (switches ? "version") $ println "Example v1.0"
when (switches ? "help") showManual
let flags = options ! "flag"
config = options ! "config"
...
This program will accept arguments like that:
-h --version -DHELLLO --config=SOME_CONFIG -f flagvalue
+ `options` in the above example is a `MultiMap String String`
+ `switches` is a `Set String`
+ `args` contains the remaining arguments as a `[String]`.
If an optional argument, defined by `optarg` is given (by its short alias or by
its long name) it will show up in the `options` `MultiMap`. Note that you can check
for a key beings set with `(?)` and retrieve all associated values with `(!)`.
Also note that `(!)` will always return a list, but possibly en empty one (if no option
was given).
Long options can be given as `--key value` or as `--key=value`.
Short options can be given as `-D value` as well as `-Dvalue`.
If a switch, defined by `switch` is given, it will show up in the `switches` `Set`.
You can query for whether a switch is set or not with `(?)`.
Switches can be combined, i.e. `-hv` is the same as `-h -v`.
If `--` is supplied as an argument, no options are evaluated beyond this point.
Any unknown or malformed option (`-x`, `--xxxx`) will be treated as an argument.
API
---
### Define options
#### `switch :: String -> Option`
Defines a command line switch with the given long name.
#### `optarg :: String -> Option`
Defines a command line option with the given long name.
#### `alias ~: option :: Char -> Option -> Option`
Defines a shorthand for the given option.
#### `option ~? check :: Option -> (String -> Bool) -> Option`
Defines a check which the optional arguments' value has to pass.
#### `option ~= pattern :: Option -> String -> Option`
Defines a pattern which the optional arguments' value must match.
### Get options and arguments
#### `type OptArgs = (MultiMap String String, Set String, [String])`
#### `getOpts :: [Options] -> IO OptArgs`
#### `getOpts' :: [Options] -> [String] -> OptArgs`
### Query MultiMaps / Sets
Part of [hydrogen-prelude](http://github.com/scravy/hydrogen-prelude).