Prompt behaviour (prompt v0.5.10) View Source

Helpers for building interactive command line interfaces.

To build a cli app that has subcommands, define a module and use Prompt, otp_app: :your_app then build a list of Prompt.Command the represent your commands and pass them to process/2. --version will pull your app version from mix.exs and --help will print your @moduledoc for help.

Example

defmodule MyApp.CLI do
  @moduledoc "This will print when a user types `myapp --help` in the commandline"
  use Prompt, otp_app: :my_app

  # the entry point to your app, takes the command line args
  def main(argv) do
    commands = [
      {"first", MyApp.CLI.FirstCommand},
      {"second", MyApp.CLI.SecondCommand}
    ]
    process(argv, commands)
  end
end

The first element in the command tuple is what you expect the user to use as a command, the second is the Prompt.Command module that will process the command.

Assuming you are building a escript, make sure to use MyApp.CLI as your module.

Once built, your command will be able to take a first and second subcommand.

>>> my_app first
...
>>> my_app second
...
>>> my_app --version
0.0.1 

Link to this section Summary

Functions

Display a choice prompt with custom answers. Takes a keyword list of answers in the form of atom to return and string to display.

Display a Y/n prompt.

Writes text to the screen.

Prompt the user for input, but conceal the users typing.

Displays options to the user denoted by numbers.

Print an ASCII table of data. Requires a list of lists as input.

Display text on the screen and wait for the users text imput.

Callbacks

Process the command line arguments based on the defined commands

Link to this section Functions

Link to this function

choice(question, custom, opts \\ [])

View Source

Specs

choice(String.t(), keyword(), keyword()) :: atom()

Display a choice prompt with custom answers. Takes a keyword list of answers in the form of atom to return and string to display.

[yes: "y", no: "n"]

will show "(y/n)" and return :yes or :no based on the choice.

Available options:

  • default_answer: the default answer. If default isn't passed, the first is the default.
  • color: A color from the IO.ANSI module

Examples

iex> Prompt.choice("Save password?", [yes: "y", no: "n", regenerate: "r"}, default_answer: :regenerate)
"Save Password? (y/n/R):" [enter]
iex> :regenerate
Link to this function

confirm(question, opts \\ [])

View Source

Specs

confirm(String.t(), keyword()) :: :yes | :no | :error

Display a Y/n prompt.

Sets 'Y' as the the default answer, allowing the user to just press the enter key. To make 'n' the default answer pass the option default_answer: :no

Available options:

  • color: A color from the IO.ANSI module
  • default_answer: :yes or :no

Examples

iex> Prompt.confirm("Send the email?")
"Send the email? (Y/n):" Y
iex> :yes

iex> Prompt.confirm("Send the email?", default_answer: :no)
"Send the email? (y/N):" [enter]
iex> :no
Link to this function

display(text, opts \\ [])

View Source

Specs

display(String.t() | [String.t()], keyword()) :: :ok

Writes text to the screen.

Takes a single string argument or a list of strings where each item in the list will be diplayed on a new line.

Available options:

  • color: A color from the IO.ANSI module
  • trim: true | false --- Defaults to false (will put a at the end of the text
  • position: :left | :right --- Print the content starting from the leftmost position or the rightmost position
  • mask_line: true | false --- Prompts the user to press enter and afterwards masks the line just printed
    • the main use case here is a password that you may want to show the user but hide after the user has a chance to write it down, or copy it.

Examples

iex> Prompt.display("Hello from the terminal!")
"Hello from the terminal!"

iex> Prompt.display(["Hello", "from", "the", "terminal"])
"Hello"
"from"
"the"
"terminal"
Link to this function

password(display, opts \\ [])

View Source

Specs

password(String.t(), keyword()) :: String.t()

Prompt the user for input, but conceal the users typing.

Available options:

  • color: A color from the IO.ANSI module

Examples

iex> Prompt.password("Enter your passsword")
"Enter your password:"
iex> "super_secret_passphrase"
Link to this function

select(display, choices, opts \\ [])

View Source

Specs

select(String.t(), [String.t()] | [{String.t(), any()}], keyword()) ::
  any() | :error

Displays options to the user denoted by numbers.

Allows for a list of 2 tuples where the first value is what is displayed and the second value is what is returned to the caller.

Available options:

  • color: A color from the IO.ANSI module

Examples

iex> Prompt.select("Choose One", ["Choice A", "Choice B"])
"  [1] Choice A"
"  [2] Choice B"
"Choose One [1-2]:" 1
iex> "Choice A"

iex> Prompt.select("Choose One", [{"Choice A", 1000}, {"Choice B", 1001}])
"  [1] Choice A"
"  [2] Choice B"
"Choose One [1-2]:" 2
iex> 1001
Link to this function

table(matrix, opts \\ [])

View Source

Specs

table([list()], keyword()) :: :ok

Print an ASCII table of data. Requires a list of lists as input.

Available Options

  • header: true | false (default) --- use the first element as a header of the table
  • TODO: title: "TITLE" --- Create a title for the table
  • TODO: border: :normal
  • TODO: borer_color:

Examples

iex> Prompt.table([["Hello", "from", "the", "terminal!"],["this", "is", "another", "row"]])
"
 +-------+------+---------+----------+
 | Hello | from | the     | terminal |
 | this  | is   | another | row      |
 +-------+------+---------+----------+
"

iex> Prompt.table([["One", "Two", "Three", "Four"], ["Hello", "from", "the", "terminal!"],["this", "is", "another", "row"]], header: true)
"
 +-------+------+---------+----------+
 | One   | Two  | Three   | Four     |
 +-------+------+---------+----------+
 | Hello | from | the     | terminal |
 | this  | is   | another | row      |
 +-------+------+---------+----------+
"

iex> Prompt.table([["Hello", "from", "the", "terminal!"],["this", "is", "another", "row"]], title: "MY TABLE")
"
 +MY TABLE------+---------+----------+
 | Hello | from | the     | terminal |
 | this  | is   | another | row      |
 +-------+------+---------+----------+
"
Link to this function

text(display, opts \\ [])

View Source

Specs

text(String.t(), keyword()) :: String.t()

Display text on the screen and wait for the users text imput.

Available options:

  • color: A color from the IO.ANSI module

Examples

iex> Prompt.text("Enter your email")
"Enter your email:" t@t.com
iex> t@t.com

Link to this section Callbacks

Specs

process(list(), [{String.t(), Process.Command}]) :: non_neg_integer()

Process the command line arguments based on the defined commands