Use OptionParser.parse
to parse user-supplied command line arguments into a keyword list:
iex> OptionParser.parse(["--source-path", "lib", "test/enum_test.exs", "--verbose"])
{[source_path: "lib", verbose: true], ["test/enum_test.exs"], []}
The return value is a triple (a 3-size tuple) containing three lists:
- a keyword list of flags/switches and their values
- a list of other non-switch arguments
- a keyword list of invalid flags and their values
You can pattern match the resulting tuple:
parsed = OptionParser.parse(["--source-path", "lib", "test/enum_test.exs", "--verbose"])
case parsed do
{[verbose: true], [filepath], _} -> :do_verbose_thing
{_, [filepath], _} -> :do_thing
_ -> :help
end
Supply the strict
parameter for enforcing allowed flags:
iex> OptionParser.parse(["--source-path", "lib", "test/enum_test.exs", "--verbose"],
strict: [source_path: :string])
{[source_path: "lib"], ["test/enum_test.exs"], [{"--verbose", nil}]}
Invalid flags such as verbose
in the above example are returned in the third list of the OptionParser.parse
result.
Elixir converts flags/switches to underscore atoms, so –source-path becomes :source_path, to better suit Elixir conventions. This means that option names on the command line cannot contain underscores; such options will be put in the invalid options list.
strict
can also enforce argument types:
iex> OptionParser.parse(["--limit", "xyz"], strict: [limit: :integer])
{[], [], [{"--limit", "xyz"}]}
The above limit
flag failed because we expected integer
, but received string
instead.
Additional reading:
- OptionParser
iex> h OptionParser.parse