# Arguments

Arguments parses command line arguments with a declarative, simple setup

Produces results as a map for super pattern matching argument handling in your app!

`$ cmd new myname --more`
`%{new: true, name: "myname", more: true}`

Documentation: [](

## Installation

Add `arguments` to your list of dependencies in `mix.exs`:

def deps do
  [{:arguments, "~> 0.1.0"}]

## Usage

Arguments provides a module with argument parsing through `YourArguments.parse(incoming)`

`use Arguments`

There are two styles of arguments allowed
- [`command`]( - `$ cmd new project`
- [`flag`]( - `$ cmd --dir /etc`

These two styles can be mixed, but the flags will always take priority

### Full Example:
module MyArguments do
  use Arguments

  command "new", do: [
    arguments: [:name, :dir]

  flag "name", do: [
    type: :string,
    alias: :n,
    defaults: fn (n) -> [
      dir: "./#\{n\}"
    ] end

  flag "more", do: %{
    type: :boolean,
    alias: :m

  flag "more_defaults", do: %{
    type: :boolean,
    alias: :m,
    defaults: [
      something: "else"

  flag "dir", do: [
    type: :string

iex> MyArguments.parse(["--name", "myname"])
%{name: "myname", dir: "./myname"}

iex> MyArguments.parse(["new", "myname", "dirhere"])
%{new: true, name: "myname", dir: "dirhere"}

iex> MyArguments.parse(["--more"])
%{more: true}

iex> MyArguments.parse(["-m"])
%{more: true}

iex> MyArguments.parse(["--not-defined"])