Prompt
Time for a little example of a simple thing you can use Term.jl
for: asking for some input. Use a Prompt
, ask a question, get an answer. Simple, but a little extra style. That's what AbstractPrompt
types are for. There's a few different flavors, which we'll look at in due time, but essentially a prompt is made of a bit of text, the prompt
that is displayed to the user, and some machinery to capture the user's input and parse it/ validate it.
For example:
using Term.Prompts
prompt = Prompt("Simple, right?");
╭───────────────────────────────────╮
│ prompt::String Simple, right? │
│ style::String #42A5F5 │
│ │
╰─────────── Term.Prompts.Prompt ───╯
creates a Prompt
object and ask
then prints the prompt and asks for input:
prompt |> ask
the output should look something like
❯❯❯ Simple, right?
here we construct a basic Prompt
and "ask" it: print the message and capture the reply. ask
returns the answer, which you can do with as you please. A small warning before we carry on:
As you can see here, readlines
, which AbstractPrompts
use to get the user's input, is a bit troublesome in VSCode. In VSCode, after the prompt gets printed you need to enter "space" (hit the space bar) and then enter and after that you can enter your actual replies.
Prompt flavours
There's a couple more ways you can use prompts like. One is to ensure you get an answer of the correct Type
, using the imaginatively names TypePrompt
:
# this only accepts `Int`s
prompt = TypePrompt(Int, "give me a number") # don't forget to |> ask
❯❯❯ give me a number
If your answer can't be converted to the correct type you'll get a AnswerValidationError
, not good.
So, what if you want to get user inputs, but you don't want to handle any crazy input they can provide? Fear not, use OptionsPrompt
so that only acceptable options will be ok. This will keep "asking" your prompt until the user's answer matches one of the given options
prompt = OptionsPrompt(["a lot", "so much", "the most"], "How likely would you be to recommend Term.jl to a friend or colleague?") # don't forget to |> ask
❯❯❯ How likely would you be to recommend Term.jl to a friend or colleague?
a lot / so much / the most
Okay, so much typing though. Let's be realistic, most likely you just want to ask a yes/no question and the answer is likely just yes. So just use a DefaultPrompt
:
# one says the first option is the default
prompt = DefaultPrompt(["yes", "no"], 1, "Confirm?") # don't forget to |> ask
❯❯❯ Confirm?
yes, no
still too much typing? You can just use the confirm
function which is equivalent to asking the prompt shown above.
Style
The style of prompt elements (e.g. the color of the prompt's text or of the options) is defined in Theme
. You can also pass style information during prompt creation:
Prompt("Do you like this color?", "red") |> println
DefaultPrompt(["yes", "no"], 1, "Confirm?", "green", "blue", "red") |> println
❯❯❯ Do you like this color?
❯❯❯ Confirm?
yes, no