defmodule Tio do
@moduledoc """
A few helpful functions for terminal I/O.
* `step` should be used to show a group of actions is about to start
* `action` should be used to show an action is starting
* `info` should be used to show any important information from an action
* `done` should be used to show a group of steps is done
Steps and actions can take blocks:
```
Tio.step "Rethreading flux capacitor" do
Tio.action "Initializing agitator" do
Tio.info("3... 2... 1...")
end
Tio.action "Regulating coherence" do
Tio.info("0.5... 0.75... 1.0")
end
end
Tio.done()
```
Messages can be iodata (strings, lists, or improper lists) and are ultimately
formatted with `IO.ANSI.format/2`. One addition is that if a message is a list,
then a `{:quoted, message}` tuple will be formatted in the quote color:
```
Tio.info(["File ", {:quoted, "foo.txt"}, " has ", {:quoted, "20"}, " lines"])
```
"""
alias Tio.Format
@spec action(message :: iodata()) :: :ok
@doc "Prints `message` describing an action that's about to start"
def action(message) do
Format.puts(:action, ["•", " ", message])
end
defmacro action(message, do: block) do
quote do
Tio.action(unquote(message))
unquote(block)
end
end
@spec done :: :ok
@doc "Prints a message indicating that all steps and actions are done"
def done do
Format.puts(:step, ["✔︎", " ", "Done"])
end
@spec info(message :: iodata()) :: :ok
@doc "Prints informational message `message`"
def info(message) do
Format.puts(:info, message)
end
@spec step(message :: iodata()) :: :ok
@doc "Prints `message` describing a step that's about to start"
def step(message) do
Format.puts(:step, ["▸", " ", message])
end
defmacro step(message, do: block) do
quote do
Tio.step(unquote(message))
unquote(block)
end
end
end