diff --git a/lib/prompt b/lib/prompt index 393a9f4..0cbf199 100644 --- a/lib/prompt +++ b/lib/prompt @@ -48,20 +48,30 @@ # prompt Text prompt for user input # default (Optional) Default value if response is empty # fail_msg (Optional) Failure message if empty input isn't valid +# required (Optional) Flag to repeat prompt until user supplies value @go.prompt_for_input() { @go.validate_identifier_or_die 'Input prompt response variable name' "$1" - if [[ "$2" =~ [[:space:]]$ ]]; then - @go.printf '%s%s%s' "${2%?}" "${3:+ [default: $3]}" "${BASH_REMATCH[0]}" >&2 - else - @go.printf '%s %s' "$2" "${3:+[default: $3] }" >&2 - fi - @go.read_prompt_response "$1" "$3" + unset "$1" + while [[ -z "${!1-}" ]]; do + if [[ "$2" =~ [[:space:]]$ ]]; then + @go.printf '%s%s%s' "${2%?}" "${3:+ [default: $3]}" "${BASH_REMATCH[0]}" >&2 + else + @go.printf '%s %s' "$2" "${3:+[default: $3] }" >&2 + fi - if [[ -z "${!1}" && -n "$4" ]]; then - @go.printf '%s\n' "$4" >&2 - return 1 - fi + @go.read_prompt_response "$1" "${3-}" + if [[ "${5-}" != "required" ]]; then + if [[ -z "${!1}" && -n "${4-}" ]]; then + @go.printf '%s\n' "$4" >&2 + return 1 + else + break + fi + fi + done + + return } # Prompts the user for a line of input, then validates it isn't dangerous diff --git a/tests/prompt/prompt-for-input.bats b/tests/prompt/prompt-for-input.bats index ea67789..06a6655 100644 --- a/tests/prompt/prompt-for-input.bats +++ b/tests/prompt/prompt-for-input.bats @@ -8,9 +8,10 @@ setup() { 'declare prompt="$1"' \ 'declare default="$2"' \ 'declare fail_msg="$3"' \ + 'declare required="$4"' \ 'declare response="initial value"' \ 'declare result' \ - '@go.prompt_for_input "response" "$prompt" "$default" "$fail_msg"' \ + '@go.prompt_for_input "response" "$prompt" "$default" "$fail_msg" "$required"' \ 'result="$?"' \ 'printf -- "%s\n" "$response"' \ 'exit "$result"' @@ -62,3 +63,10 @@ teardown() { assert_failure 'What is your quest?' \ 'Auuuuuuuugh!' } + +@test "$SUITE: re-prompts if input is required" { + run "$TEST_GO_SCRIPT" $'What is your quest?\n' '' '' 'required' <<< $'\n''None' + assert_success 'What is your quest?' \ + 'What is your quest?' \ + 'None' +}