diff --git a/Makefile b/Makefile index a3d23aa..b1f4812 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,6 @@ _release: echo "❗User Error: Please specify a version number (e.g. make _release v0.0.5)"; \ exit 1; \ fi - @echo "" $(eval VERSION := $(filter-out $@,$(MAKECMDGOALS))) @if [ "$$(git branch --show-current)" != "main" ]; then \ echo "❗User Error: Releases can only be made from the main branch"; \ @@ -45,15 +44,15 @@ _release: fi; \ $(MAKE) build @echo "" - sed -i '' "s/# Version: .*/# Version: $(VERSION)/" $(OUTPUT); \ - sed -i '' -E "s/v[0-9]+\.[0-9]+\.[0-9]+/$(VERSION)/" $(README); \ - git add $(OUTPUT) $(README); \ + @sed -i '' "s/# Version: .*/# Version: $(VERSION)/" $(OUTPUT); \ + sed -i '' -E "s/v[0-9]+\.[0-9]+\.[0-9]+/$(VERSION)/" $(README) + @git add $(OUTPUT) $(README); \ git commit -m "Release $(VERSION)"; \ git tag -a "$(VERSION)" -m "Release $(VERSION)" @echo "" - git push --follow-tags + @git push --follow-tags @echo "" - gh release create "$(VERSION)" --generate-notes --title "⚡ $(VERSION)" "$(OUTPUT)#beddu.sh" + @gh release create "$(VERSION)" --generate-notes --title "⚡ $(VERSION)" "$(OUTPUT)#beddu.sh" @echo "\n\033[32m✔︎\033[0m Release complete: \033[32m$(VERSION)\033[0m" # Get the last version tag and increment the appropriate part diff --git a/README.md b/README.md index 7512a2c..9ce4972 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Beddu +# Beddu 💅🏻 A lightweight bash framework for interactive scripts with pretty output. @@ -26,10 +26,10 @@ And you will easily be able to build things like: **Beddu** is meant to be sourced in your own script. -1. Download the latest release (currently: **v1.0.0**) of `beddu.sh` to your project: +1. Download the latest release (currently: **v1.1.0**) of `beddu.sh` to your project: ```bash -$ curl -O https://raw.githubusercontent.com/mjsarfatti/beddu/refs/tags/v1.0.0/dist/beddu.sh +$ curl -O https://raw.githubusercontent.com/mjsarfatti/beddu/refs/tags/v1.1.0/dist/beddu.sh ``` 2. Source the `beddu.sh` file in your script: @@ -78,10 +78,15 @@ pen "This is $(pen yellow "yellow"), and this is $(pen bold "bold")" ### Interactive Functions ```bash -# Ask for input -ask name "What's your name?" +# Kindly ask for input (empty answer is accepted) +seek name "What's your 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") if confirm "Continue?"; then pen green "Continuing..." @@ -131,7 +136,8 @@ check "Task completed!" # We can directly `check`, `warn`, or `throw` after a `s ### 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 - `--default-yes` - Set default answer to "yes" (default behavior) - `--default-no` - Set default answer to "no" diff --git a/demo/asciinema.png b/demo/asciinema.png new file mode 100644 index 0000000..3e56468 Binary files /dev/null and b/demo/asciinema.png differ diff --git a/demo/carbon.png b/demo/carbon.png index 3e9a4e1..1271e27 100644 Binary files a/demo/carbon.png and b/demo/carbon.png differ diff --git a/demo/carbon.sh b/demo/carbon.sh index 09a425e..21723a8 100755 --- a/demo/carbon.sh +++ b/demo/carbon.sh @@ -2,20 +2,17 @@ . beddu.sh -line -pen purple "Hello, I'm your IP helper, here to help you will all your IP needs." -line +pen purple "Hello, I'm your IP helper, here for all your IP needs!" -choose action "What would you like to do?" "Get my IP" "Get my location" +choose ACTION "What would you like to do?" "Get my IP" "Get my location" -case "$action" in +case "$ACTION" in "Get my IP") - run --out ip curl ipinfo.io/ip - line; pen "Your IP is $ip" + run --out IP curl ipinfo.io/ip + pen "Your IP is $IP" ;; - "Get my location") - run --out location curl -s ipinfo.io/loc - line; pen "Your coordinates are $location" + "Get my LOCATION") + run --out LOCATION curl -s ipinfo.io/loc + pen "Your coordinates are $LOCATION" ;; esac - diff --git a/demo/demo.sh b/demo/demo.sh index b7086e5..7467257 100755 --- a/demo/demo.sh +++ b/demo/demo.sh @@ -102,7 +102,7 @@ demo() { pen $_pink italic "-- Interactive functions --" line - ask name "How can I call you?" + request name "How can I call you?" pen "Hello, $(pen bold cyan "${name:?}")" line diff --git a/dist/beddu.sh b/dist/beddu.sh index c90a131..9c7ac14 100755 --- a/dist/beddu.sh +++ b/dist/beddu.sh @@ -2,7 +2,7 @@ # shellcheck disable=all # # beddu.sh - A lightweight bash framework for interactive scripts and pretty output -# Version: v1.0.0 +# Version: v1.1.0 # # Copyright © 2025 Manuele Sarfatti # Licensed under the MIT license @@ -190,29 +190,6 @@ warn() { 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() { local -n outvar="$1" local prompt @@ -309,3 +286,40 @@ confirm() { esac 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" +} diff --git a/src/03.prompt/ask.sh b/src/03.prompt/request.sh similarity index 82% rename from src/03.prompt/ask.sh rename to src/03.prompt/request.sh index a7c87cc..2130412 100644 --- a/src/03.prompt/ask.sh +++ b/src/03.prompt/request.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # 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 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/../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: -# ask outvar text +# request outvar text # Example: -# ask name "What is your name?" +# request name "What is your name?" # echo "Hello, $name!" -ask() { +request() { local -n outvar="$1" # Declare nameref local prompt local answer diff --git a/src/03.prompt/seek.sh b/src/03.prompt/seek.sh new file mode 100644 index 0000000..a5e770f --- /dev/null +++ b/src/03.prompt/seek.sh @@ -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" +}