Packages
igniter
0.6.26
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/igniter/util/io.ex
defmodule Igniter.Util.IO do
@moduledoc "Helpers for working with input/output"
@doc "Prompts the user for yes or no, repeating the prompt until a satisfactory answer is given"
def yes?(prompt) do
case Mix.shell().prompt(prompt <> " [Y/n]") do
:eof ->
raise "No input detected when asking for confirmation, perhaps you meant to use `--yes`?"
str ->
case String.trim(str) do
# default answer Y
"" ->
true
yes when yes in ["y", "Y", "yes", "YES"] ->
true
no when no in ["n", "N", "no", "NO"] ->
false
value ->
Mix.shell().info("Please enter one of [y/n]. Got: #{value}")
yes?(prompt)
end
end
end
@doc """
Prompts the user to select from a list, repeating until an item is selected
## Options
- `display`: A function that takes an item and returns a string to display
"""
def select(prompt, items, opts \\ [])
def select(_prompt, [], _opts), do: nil
def select(_prompt, [item], _opts), do: item
def select(prompt, items, opts) do
display = Keyword.get(opts, :display, &to_string/1)
item_numbers =
items
|> Enum.with_index()
|> Enum.map_join("\n", fn {item, index} ->
if Keyword.has_key?(opts, :default) && item == opts[:default] do
"#{IO.ANSI.green()}#{index}.#{IO.ANSI.reset()} #{display.(item)} (Default)"
else
"#{index}. #{display.(item)}"
end
end)
case String.trim(Mix.shell().prompt(prompt <> "\n" <> item_numbers <> "\nInput number ❯ ")) do
"" ->
case Keyword.fetch(opts, :default) do
{:ok, value} ->
value
:error ->
select(prompt, items, opts)
end
item ->
case Integer.parse(item) do
{int, ""} ->
case Enum.at(items, int) do
nil ->
Mix.shell().info("Expected one of the provided numbers, got: #{item}")
select(prompt, items, opts)
value ->
value
end
_ ->
Mix.shell().info("Expected a number, got: #{item}")
select(prompt, items, opts)
end
end
end
end