Firex is a library for automatically generating command line interfaces (CLIs) from an elixir module
- Inspired by Python Fire
- Built on top of
OptionParser
andescript
- Enhance exploring existing code or turning other people's code into a CLI for evaluation.
- Outputs escript script executable (binary data)
Add use Firex
to any module you would like to expose
defmodule Example do
use Firex
@moduledoc """
Module for my awesome launcher
"""
@doc """
Launch some awesome thing
"""
@spec launch(String.t, String.t) :: String.t
def launch(message, path) do
IO.puts "Hallo #{message} at `#{path}`"
end
@spec launch(String.t, String.t, Bool.t) :: String.t
def launch(message, path, force) do
IO.puts "Hallo #{message} at `#{path}` and forced #{force}"
end
@doc """
Stop previous task by id
"""
@spec stop(String.t) :: String.t
def stop(task_id) do
IO.puts "Stopping task #{task_id}"
end
@doc """
Increments by one
"""
@spec inc(Integer.t) :: String.t
def inc(number) do
IO.puts "Result #{number + 1}"
end
end
Add it escript: [main_module: Example]
to your mix file
# mix.exs
def project do
[
...
escript: [main_module: Example],
...
]
end
and then
➜ mix escript.build
Generated escript app with MIX_ENV=dev
➜ ./app
Module for my awesome launcher
Available commands:
launch: -m --message [message:string], -p --path [path:string], -f --force [force:boolean]
Launch some awesome thing
stop: -t --task_id [task_id:string]
Stop previous task by id
inc: -n --number [number:integer]
Increments by one
➜ ./app inc -n 3
Result 4
If available in Hex, the package can be installed as:
Add firex
to your list of dependencies in mix.exs
:
def deps do
[{:firex, "~> 0.1.0"}]
end
Known issues and opportunity for improvements:
- Convert
@spec
intoOptionParser
flags- Currently only
:string
is used
- Currently only
- Proper exit codes
- Proper exit code on traceback
- Warn when extra arguments passed
- Autoregister main module - e.g `escript: [main_module: Example]``
- Colour output
Firex is MIT Licensed.