ExCLI

Elixir library to build CLI applications.

Installation

Add ex_cli to your list of dependencies in mix.exs:

def deps do
  [{:ex_cli, "~> 0.0.1"}]
end

Usage

The basic usage is to use ExCLI.DSL to define your CLI, and ExCLI.run to run it. Here is a sample application:

defmodule MyApp.SampleCLI do
  use ExCLI.DSL

  name "mycli"
  description "My CLI"
  long_description ~s"""
  This is my long description
  """

  option :verbose, count: true, aliases: [:v]

  command :hello do
    description "Greets the user"
    long_description """
    Gives a nice a warm greeting to whoever would listen
    """

    argument :name
    option :from, help: "the sender of hello"

    run context do
      if context.verbose > 0 do
        IO.puts("Running hello command")
      end
      if from = context[:from] do
        IO.write("#{from} says: ")
      end
      IO.puts("Hello #{context.name}!")
    end
  end
end

ExCLI.run(MyApp.SampleCLI)

Which can be used in the following way.

sample_cli hello -vv world --from me

Roadmap

  • [x] Command parser
  • [ ] Usage generation
  • [ ] Help command
  • [ ] Command parser improvements
  • [ ] Man page generation

The command parser is now working and should be enough for a good number of tasks.

The next step is to get a pretty usage that can be shown to the user.

Then the goal will be to add a help command which can be used as app help command to show help about command.

When the usage and help parts are done, there are a few improvements that will be nice to have in the command parser:

  • the ability to set a default command
  • the ability to easily delegate a command to another module
  • fuzzy handling of command (i.e. npm insta will run npm install)

When all this is done, the last part will to generate documentation in man page and markdown formats, which will probably be done as a mix task.

Contributing

Contributions are very welcome, feel free to open an issue or a PR.

I am also looking for a better name, ideas are welcome!