diff --git a/poc b/poc index 66c63ad..8be5ac2 100755 --- a/poc +++ b/poc @@ -4,7 +4,39 @@ MIAOU_BASH_ERROR=$(mktemp -t "$(basename "$0").XXXXXXXX" --tmpdir="/run/user/$(id -u)") 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 @@ -20,8 +52,12 @@ function miaou_debug { } 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 { @@ -75,6 +111,7 @@ function on_pipe { lineno=${BASH_REMATCH[2]} failure_code=${BASH_REMATCH[3]} failure_type="SUBSHELL_ERROR" + failure_payload='...' error_source=("$source" "${error_source[@]}") error_lineno=("$lineno" "${error_lineno[@]}") error_funcname=("${error_funcname[@]}" '
') @@ -89,28 +126,26 @@ function on_pipe { function dump_stderr { miaou_debug --stderr-- mapfile -t tmp_error <"$MIAOU_BASH_ERROR" - tty_ansi 94 + tty_ansi FG_LIGHTBLUE for i in "${tmp_error[@]}"; do echo "$i"; done - tty_ansi 0 + tty_ansi RESET miaou_debug --end of stderr-- } function dump_failure { local i 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 '╔' for i in $(seq 1 $length_box); do echo -n '═'; done 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 " - tty_ansi 95 + tty_ansi FG_MAGENTA echo "║" echo -n '╚' 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 echo '╝' echo " ║" - tty_ansi 0 + tty_ansi RESET miaou_debug --end of tty error box-- } @@ -126,15 +161,15 @@ function dump_stacktrace { miaou_debug --stacktrace ${#error_source[@]}-- local i source lineno funcname for i in "${!error_source[@]}"; do - tty_ansi 95 + tty_ansi FG_MAGENTA 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]}" lineno="${error_lineno[$i]}" funcname="${error_funcname[$i]}" printf "%40s:%.4s" "$source" "$lineno" - tty_ansi 0 + tty_ansi RESET printf " \t%s" "$funcname" echo done