Ask -> Request, while Seek makes the answer optional

This commit is contained in:
Manuele Sarfatti 2025-05-20 17:33:11 +02:00
parent 5ff6a50d32
commit ce6bfcd04c
6 changed files with 93 additions and 33 deletions

View file

@ -78,10 +78,15 @@ pen "This is $(pen yellow "yellow"), and this is $(pen bold "bold")"
### Interactive Functions ### Interactive Functions
```bash ```bash
# Ask for input # Kindly ask for input (empty answer is accepted)
ask name "What's your name?" seek name "What's your name?"
pen "Hello, $name!" pen "Hello, $name!"
# Firmly ask for input (empty answer NOT accepted)
request name "No really, what's your name?"
pen "There you go, $name!"
# Yes/no confirmation (defaults to "yes") # Yes/no confirmation (defaults to "yes")
if confirm "Continue?"; then if confirm "Continue?"; then
pen green "Continuing..." pen green "Continuing..."
@ -131,7 +136,8 @@ check "Task completed!" # We can directly `check`, `warn`, or `throw` after a `s
### User Interaction ### User Interaction
- `ask [retval] PROMPT` - Get text input from user, saves the answer in `$retval` - `seek [retval] PROMPT` - Get (optional) text input from user, saves the answer in `$retval`
- `request [retval] PROMPT` - Like above, but doesn't accept an empty response, saves the answer in `$retval`
- `confirm [OPTIONS] PROMPT` - Get yes/no input - `confirm [OPTIONS] PROMPT` - Get yes/no input
- `--default-yes` - Set default answer to "yes" (default behavior) - `--default-yes` - Set default answer to "yes" (default behavior)
- `--default-no` - Set default answer to "no" - `--default-no` - Set default answer to "no"

BIN
demo/asciinema.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

View file

@ -102,7 +102,7 @@ demo() {
pen $_pink italic "-- Interactive functions --" pen $_pink italic "-- Interactive functions --"
line line
ask name "How can I call you?" request name "How can I call you?"
pen "Hello, $(pen bold cyan "${name:?}")" pen "Hello, $(pen bold cyan "${name:?}")"
line line

62
dist/beddu.sh vendored
View file

@ -2,7 +2,7 @@
# shellcheck disable=all # shellcheck disable=all
# #
# beddu.sh - A lightweight bash framework for interactive scripts and pretty output # beddu.sh - A lightweight bash framework for interactive scripts and pretty output
# Version: v1.0.0 # Version: v1.0.0-1-g5ff6a50-dirty
# #
# Copyright © 2025 Manuele Sarfatti # Copyright © 2025 Manuele Sarfatti
# Licensed under the MIT license # Licensed under the MIT license
@ -190,29 +190,6 @@ warn() {
pen italic "$@" pen italic "$@"
} }
ask() {
local -n outvar="$1"
local prompt
local answer
prompt=$(
pen -n blue "${_q:-?} "
pen "${2}"
pen -n blue "${_a:-} "
)
show_cursor
while true; do
read -r -p "$prompt" answer
case "$answer" in
"")
echo
warn "Please type your answer."
;;
*) break ;;
esac
done
outvar="$answer"
}
choose() { choose() {
local -n outvar="$1" local -n outvar="$1"
local prompt local prompt
@ -309,3 +286,40 @@ confirm() {
esac esac
done done
} }
request() {
local -n outvar="$1"
local prompt
local answer
prompt=$(
pen -n blue "${_q:-?} "
pen "${2}"
pen -n blue "${_a:-} "
)
show_cursor
while true; do
read -r -p "$prompt" answer
case "$answer" in
"")
echo
warn "Please type your answer."
;;
*) break ;;
esac
done
outvar="$answer"
}
seek() {
local -n outvar="$1"
local prompt
local answer
prompt=$(
pen -n blue "${_q:-?} "
pen "${2}"
pen -n blue "${_a:-} "
)
show_cursor
read -r -p "$prompt" answer
outvar="$answer"
}

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# shellcheck disable=SC1091 # shellcheck disable=SC1091
# ask.sh - Get free text input from the user # request.sh - Get required text input from the user
[[ $BEDDU_ASK_LOADED ]] && return [[ $BEDDU_ASK_LOADED ]] && return
readonly BEDDU_ASK_LOADED=true readonly BEDDU_ASK_LOADED=true
@ -11,14 +11,14 @@ source "$SCRIPT_DIR/../00.utils/movements.sh"
source "$SCRIPT_DIR/../01.core/pen.sh" source "$SCRIPT_DIR/../01.core/pen.sh"
source "$SCRIPT_DIR/../02.ui/warn.sh" source "$SCRIPT_DIR/../02.ui/warn.sh"
# Ask a question and get a free text answer from the user # Ask a question and require a free text answer from the user
# #
# Usage: # Usage:
# ask outvar text # request outvar text
# Example: # Example:
# ask name "What is your name?" # request name "What is your name?"
# echo "Hello, $name!" # echo "Hello, $name!"
ask() { request() {
local -n outvar="$1" # Declare nameref local -n outvar="$1" # Declare nameref
local prompt local prompt
local answer local answer

40
src/03.prompt/seek.sh Normal file
View file

@ -0,0 +1,40 @@
#!/usr/bin/env bash
# shellcheck disable=SC1091
# seek.sh - Get free text input from the user
[[ $BEDDU_ASK_LOADED ]] && return
readonly BEDDU_ASK_LOADED=true
SCRIPT_DIR="$(dirname -- "${BASH_SOURCE[0]}")"
source "$SCRIPT_DIR/../00.utils/_symbols.sh"
source "$SCRIPT_DIR/../00.utils/movements.sh"
source "$SCRIPT_DIR/../01.core/pen.sh"
source "$SCRIPT_DIR/../02.ui/warn.sh"
# Ask a question and get a free text answer from the user
#
# Usage:
# seek outvar text
# Example:
# seek name "What is your name?"
# echo "Hello, $name!"
seek() {
local -n outvar="$1" # Declare nameref
local prompt
local answer
# Set prompt with default indicator
prompt=$(
pen -n blue "${_q:-?} "
pen "${2}"
pen -n blue "${_a:-} "
)
show_cursor
# Get response
read -r -p "$prompt" answer
# shellcheck disable=SC2034
outvar="$answer"
}