Create msg.func
This commit is contained in:
parent
ab060c83d6
commit
0ad426a86b
98
misc/msg.func
Normal file
98
misc/msg.func
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Spinner state
|
||||||
|
declare -A SPINNER_PIDS
|
||||||
|
declare -A SPINNER_MSGS
|
||||||
|
declare -A MSG_SHOWN
|
||||||
|
|
||||||
|
# Color definitions (adjust as needed)
|
||||||
|
RD='\033[0;31m'
|
||||||
|
GN='\033[0;32m'
|
||||||
|
YW='\033[0;33m'
|
||||||
|
CL='\033[0m'
|
||||||
|
CM='✔'
|
||||||
|
CROSS='✘'
|
||||||
|
|
||||||
|
# Trap cleanup
|
||||||
|
trap cleanup_spinners EXIT INT TERM HUP
|
||||||
|
|
||||||
|
# Hash function for message ID
|
||||||
|
msg_hash() {
|
||||||
|
local input="$1"
|
||||||
|
echo -n "$input" | sha1sum | awk '{print $1}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Start a spinner for a specific message
|
||||||
|
start_spinner_for_msg() {
|
||||||
|
local msg="$1"
|
||||||
|
local id
|
||||||
|
id=$(msg_hash "$msg")
|
||||||
|
|
||||||
|
[[ -n "${MSG_SHOWN["$id"]+x}" ]] && return
|
||||||
|
MSG_SHOWN["$id"]=1
|
||||||
|
SPINNER_MSGS["$id"]="$msg"
|
||||||
|
|
||||||
|
local frames=(⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏)
|
||||||
|
local interval=0.1
|
||||||
|
local spin_i=0
|
||||||
|
|
||||||
|
{
|
||||||
|
while true; do
|
||||||
|
printf "\r\e[2K%s %b" "${frames[spin_i]}" "${YW}${msg}${CL}" >&2
|
||||||
|
spin_i=$(((spin_i + 1) % ${#frames[@]}))
|
||||||
|
sleep "$interval"
|
||||||
|
done
|
||||||
|
} &
|
||||||
|
|
||||||
|
SPINNER_PIDS["$id"]=$!
|
||||||
|
disown "${SPINNER_PIDS["$id"]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Stop the spinner for a specific message
|
||||||
|
stop_spinner_for_msg() {
|
||||||
|
local msg="$1"
|
||||||
|
local id
|
||||||
|
id=$(msg_hash "$msg")
|
||||||
|
|
||||||
|
if [[ -n "${SPINNER_PIDS["$id"]+x}" ]] && ps -p "${SPINNER_PIDS["$id"]}" >/dev/null 2>&1; then
|
||||||
|
kill "${SPINNER_PIDS["$id"]}" 2>/dev/null
|
||||||
|
wait "${SPINNER_PIDS["$id"]}" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset SPINNER_PIDS["$id"]
|
||||||
|
unset SPINNER_MSGS["$id"]
|
||||||
|
unset MSG_SHOWN["$id"]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cleanup all active spinners
|
||||||
|
cleanup_spinners() {
|
||||||
|
for id in "${!SPINNER_PIDS[@]}"; do
|
||||||
|
if ps -p "${SPINNER_PIDS[$id]}" >/dev/null 2>&1; then
|
||||||
|
kill "${SPINNER_PIDS[$id]}" 2>/dev/null
|
||||||
|
wait "${SPINNER_PIDS[$id]}" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
unset SPINNER_PIDS["$id"]
|
||||||
|
unset SPINNER_MSGS["$id"]
|
||||||
|
unset MSG_SHOWN["$id"]
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Show info message with spinner
|
||||||
|
msg_info() {
|
||||||
|
local msg="$1"
|
||||||
|
start_spinner_for_msg "$msg"
|
||||||
|
}
|
||||||
|
|
||||||
|
# End spinner and show success message
|
||||||
|
msg_ok() {
|
||||||
|
local msg="$1"
|
||||||
|
stop_spinner_for_msg "$msg"
|
||||||
|
printf "\r\e[2K%s %b\n" "${CM}" "${GN}${msg}${CL}" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
# End spinner and show error message
|
||||||
|
msg_error() {
|
||||||
|
local msg="$1"
|
||||||
|
stop_spinner_for_msg "$msg"
|
||||||
|
printf "\r\e[2K%s %b\n" "${CROSS}" "${RD}${msg}${CL}" >&2
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user