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 runnpm 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!