|
|
@ -4,7 +4,39 @@ |
|
|
|
|
|
|
|
|
MIAOU_BASH_ERROR=$(mktemp -t "$(basename "$0").XXXXXXXX" --tmpdir="/run/user/$(id -u)") |
|
|
MIAOU_BASH_ERROR=$(mktemp -t "$(basename "$0").XXXXXXXX" --tmpdir="/run/user/$(id -u)") |
|
|
MIAOU_DEBUG=${MIAOU_DEBUG:-false} |
|
|
MIAOU_DEBUG=${MIAOU_DEBUG:-false} |
|
|
readonly MIAOU_BASH_ERROR MIAOU_DEBUG |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
declare -A ANSI |
|
|
|
|
|
ANSI[RESET]=0 |
|
|
|
|
|
|
|
|
|
|
|
ANSI[STYLE_ITALIC]=3 |
|
|
|
|
|
ANSI[STYLE_BOLD]=1 |
|
|
|
|
|
ANSI[STYLE_UNDERLINE]=4 |
|
|
|
|
|
ANSI[STYLE_STRIKETHROUGH]=9 |
|
|
|
|
|
|
|
|
|
|
|
ANSI[FG_BLACK]=30 |
|
|
|
|
|
ANSI[FG_RED]=31 |
|
|
|
|
|
ANSI[FG_GREEN]=32 |
|
|
|
|
|
ANSI[FG_YELLOW]=33 |
|
|
|
|
|
ANSI[FG_BLUE]=34 |
|
|
|
|
|
ANSI[FG_PURPLE]=35 |
|
|
|
|
|
ANSI[FG_CYAN]=36 |
|
|
|
|
|
ANSI[FG_WHITE]=37 |
|
|
|
|
|
ANSI[FG_GRAY]=90 |
|
|
|
|
|
ANSI[FG_LIGHTBLUE]=94 |
|
|
|
|
|
ANSI[FG_MAGENTA]=95 |
|
|
|
|
|
|
|
|
|
|
|
ANSI[BG_BLACK]=40 |
|
|
|
|
|
ANSI[BG_RED]=41 |
|
|
|
|
|
ANSI[BG_GREEN]=42 |
|
|
|
|
|
ANSI[BG_YELLOW]=43 |
|
|
|
|
|
ANSI[BG_BLUE]=44 |
|
|
|
|
|
ANSI[BG_PURPLE]=45 |
|
|
|
|
|
ANSI[BG_CYAN]=46 |
|
|
|
|
|
ANSI[BG_WHITE]=47 |
|
|
|
|
|
ANSI[BG_GRAY]=90 |
|
|
|
|
|
ANSI[BG_MAGENTA]=95 |
|
|
|
|
|
|
|
|
|
|
|
readonly MIAOU_BASH_ERROR MIAOU_DEBUG ANSI |
|
|
|
|
|
|
|
|
## functions |
|
|
## functions |
|
|
|
|
|
|
|
|
@ -20,8 +52,12 @@ function miaou_debug { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function tty_ansi { |
|
|
function tty_ansi { |
|
|
fg="${1:-}" |
|
|
|
|
|
[[ -n $fg ]] && >/dev/tty echo -ne "\e[${fg}m" || true |
|
|
|
|
|
|
|
|
local code="$1" |
|
|
|
|
|
if [[ -v ANSI[$code] ]]; then |
|
|
|
|
|
>/dev/tty echo -ne "\e[${ANSI[$code]}m" |
|
|
|
|
|
else |
|
|
|
|
|
>&2 echo "unknown ansi key: <$code>" |
|
|
|
|
|
fi |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function print_miaou_error { |
|
|
function print_miaou_error { |
|
|
@ -75,6 +111,7 @@ function on_pipe { |
|
|
lineno=${BASH_REMATCH[2]} |
|
|
lineno=${BASH_REMATCH[2]} |
|
|
failure_code=${BASH_REMATCH[3]} |
|
|
failure_code=${BASH_REMATCH[3]} |
|
|
failure_type="SUBSHELL_ERROR" |
|
|
failure_type="SUBSHELL_ERROR" |
|
|
|
|
|
failure_payload='...' |
|
|
error_source=("$source" "${error_source[@]}") |
|
|
error_source=("$source" "${error_source[@]}") |
|
|
error_lineno=("$lineno" "${error_lineno[@]}") |
|
|
error_lineno=("$lineno" "${error_lineno[@]}") |
|
|
error_funcname=("${error_funcname[@]}" '<main>') |
|
|
error_funcname=("${error_funcname[@]}" '<main>') |
|
|
@ -89,28 +126,26 @@ function on_pipe { |
|
|
function dump_stderr { |
|
|
function dump_stderr { |
|
|
miaou_debug --stderr-- |
|
|
miaou_debug --stderr-- |
|
|
mapfile -t tmp_error <"$MIAOU_BASH_ERROR" |
|
|
mapfile -t tmp_error <"$MIAOU_BASH_ERROR" |
|
|
tty_ansi 94 |
|
|
|
|
|
|
|
|
tty_ansi FG_LIGHTBLUE |
|
|
for i in "${tmp_error[@]}"; do echo "$i"; done |
|
|
for i in "${tmp_error[@]}"; do echo "$i"; done |
|
|
tty_ansi 0 |
|
|
|
|
|
|
|
|
tty_ansi RESET |
|
|
miaou_debug --end of stderr-- |
|
|
miaou_debug --end of stderr-- |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function dump_failure { |
|
|
function dump_failure { |
|
|
local i |
|
|
local i |
|
|
miaou_debug --tty error box-- |
|
|
miaou_debug --tty error box-- |
|
|
tty_ansi 95 |
|
|
|
|
|
length_box=$((${#failure_type} + ${#failure_code} + (2 * 2) + 1)) |
|
|
|
|
|
|
|
|
tty_ansi FG_MAGENTA |
|
|
|
|
|
length_box=$((${#failure_type} + ${#failure_code} + (2 * 2) + 2)) |
|
|
|
|
|
[[ -v failure_payload ]] && length_box=$((length_box + ${#failure_payload} + (2 * 2) + 1)) |
|
|
echo -n '╔' |
|
|
echo -n '╔' |
|
|
for i in $(seq 1 $length_box); do echo -n '═'; done |
|
|
for i in $(seq 1 $length_box); do echo -n '═'; done |
|
|
echo '╗' |
|
|
echo '╗' |
|
|
echo -n "║ $failure_type" |
|
|
|
|
|
if [[ -v failure_payload ]]; then |
|
|
|
|
|
tty_ansi 94 |
|
|
|
|
|
echo -n " $failure_payload" |
|
|
|
|
|
fi |
|
|
|
|
|
tty_ansi 33 |
|
|
|
|
|
|
|
|
echo -n "║ $failure_type " |
|
|
|
|
|
[[ -v failure_payload ]] && echo -n ' ' && tty_ansi FG_CYAN && echo -n " $failure_payload " |
|
|
|
|
|
tty_ansi FG_YELLOW |
|
|
printf "%5s" " $failure_code " |
|
|
printf "%5s" " $failure_code " |
|
|
tty_ansi 95 |
|
|
|
|
|
|
|
|
tty_ansi FG_MAGENTA |
|
|
echo "║" |
|
|
echo "║" |
|
|
echo -n '╚' |
|
|
echo -n '╚' |
|
|
for i in $(seq 1 4); do echo -n '═'; done |
|
|
for i in $(seq 1 4); do echo -n '═'; done |
|
|
@ -118,7 +153,7 @@ function dump_failure { |
|
|
for i in $(seq $((i + 2)) $length_box); do echo -n '═'; done |
|
|
for i in $(seq $((i + 2)) $length_box); do echo -n '═'; done |
|
|
echo '╝' |
|
|
echo '╝' |
|
|
echo " ║" |
|
|
echo " ║" |
|
|
tty_ansi 0 |
|
|
|
|
|
|
|
|
tty_ansi RESET |
|
|
miaou_debug --end of tty error box-- |
|
|
miaou_debug --end of tty error box-- |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -126,15 +161,15 @@ function dump_stacktrace { |
|
|
miaou_debug --stacktrace ${#error_source[@]}-- |
|
|
miaou_debug --stacktrace ${#error_source[@]}-- |
|
|
local i source lineno funcname |
|
|
local i source lineno funcname |
|
|
for i in "${!error_source[@]}"; do |
|
|
for i in "${!error_source[@]}"; do |
|
|
tty_ansi 95 |
|
|
|
|
|
|
|
|
tty_ansi FG_MAGENTA |
|
|
echo -n " ╟─⟶" |
|
|
echo -n " ╟─⟶" |
|
|
[[ $i -gt 0 ]] && tty_ansi 90 |
|
|
|
|
|
tty_ansi 3 |
|
|
|
|
|
|
|
|
[[ $i -gt 0 ]] && tty_ansi FG_GRAY |
|
|
|
|
|
tty_ansi STYLE_ITALIC |
|
|
source="${error_source[$i]}" |
|
|
source="${error_source[$i]}" |
|
|
lineno="${error_lineno[$i]}" |
|
|
lineno="${error_lineno[$i]}" |
|
|
funcname="${error_funcname[$i]}" |
|
|
funcname="${error_funcname[$i]}" |
|
|
printf "%40s:%.4s" "$source" "$lineno" |
|
|
printf "%40s:%.4s" "$source" "$lineno" |
|
|
tty_ansi 0 |
|
|
|
|
|
|
|
|
tty_ansi RESET |
|
|
printf " \t%s" "$funcname" |
|
|
printf " \t%s" "$funcname" |
|
|
echo |
|
|
echo |
|
|
done |
|
|
done |
|
|
|