From 004ca42f2dbcedd899cd318660681a4f963d5efe Mon Sep 17 00:00:00 2001 From: Nikolaos Kakouros Date: Fri, 19 Jan 2018 21:27:29 +0100 Subject: [PATCH 1/3] Adds option in prompt_for_input to reprompt the user until they enter text --- lib/prompt | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/prompt b/lib/prompt index 393a9f4..8078734 100644 --- a/lib/prompt +++ b/lib/prompt @@ -48,20 +48,29 @@ # 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 +# persist (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" + 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-}" != "persist" ]]; 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 From e6a45cde795c73a1659a104f5f3012c68567b934 Mon Sep 17 00:00:00 2001 From: Nikolaos Kakouros Date: Sat, 20 Jan 2018 23:20:58 +0100 Subject: [PATCH 2/3] Unsets existing value of variable to be read --- lib/prompt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/prompt b/lib/prompt index 8078734..0cbf199 100644 --- a/lib/prompt +++ b/lib/prompt @@ -48,10 +48,11 @@ # 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 -# persist (Optional) Flag to repeat prompt until user supplies value +# 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" + unset "$1" while [[ -z "${!1-}" ]]; do if [[ "$2" =~ [[:space:]]$ ]]; then @go.printf '%s%s%s' "${2%?}" "${3:+ [default: $3]}" "${BASH_REMATCH[0]}" >&2 @@ -60,7 +61,7 @@ fi @go.read_prompt_response "$1" "${3-}" - if [[ "${5-}" != "persist" ]]; then + if [[ "${5-}" != "required" ]]; then if [[ -z "${!1}" && -n "${4-}" ]]; then @go.printf '%s\n' "$4" >&2 return 1 From 30d04a6c591c7c8db92c6d95712033ea329f2484 Mon Sep 17 00:00:00 2001 From: Nikolaos Kakouros Date: Sat, 20 Jan 2018 23:39:29 +0100 Subject: [PATCH 3/3] Adds test for "required" prompt argument --- tests/prompt/prompt-for-input.bats | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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' +}