Browse Source

smarter ansi_error

main
pvincent 5 days ago
parent
commit
0a5e0cdce4
  1. 57
      bin/miaou-bash
  2. 19
      lib/ansi.bash
  3. 64
      test/stub/ansi_error.bash
  4. 4
      test/stub/scenario.bash

57
bin/miaou-bash

@ -188,7 +188,6 @@ function on_exit {
failure_traces+=("$stack_detail")
done
dump_failure
# builtin exit "$code"
else
dump_success
fi
@ -199,6 +198,46 @@ function debug {
is_true "${MIAOU_BASH_DEBUG}" && >/dev/tty echo "*********** DEBUG: $*" || true
}
function ansi_block_continuation {
tput sc
tput cuu 1
BG=RED FG=BLACK style_ansi "\t╦"
tput rc
FG=RED style_ansi "\t║\n"
}
function ansi_block_error {
BG=RED
FG=BLACK
PADDING=2
local content detail exit_code
content=$(style_ansi "$1")
content=$(style_padding "$content")
detail=$(BG=BLACK style_padding "$2")
exit_code=$(FG=CYAN style_ansi " $3")
style_block "$content$detail$exit_code"
ansi_reset
}
function ansi_traces {
local optional location sources lines functions
declare -n sources=$1
declare -n lines=$2
declare -n functions=$3
optional=false
for i in "${!sources[@]}"; do
FG=RED style_ansi "\t╟─⟶"
location="${sources[$i]}:${lines[$i]}"
is_true "$optional" &&
location=$(FG=GRAY STYLE=ITALIC style_ansi "\t$location") || # FIXME: \t should not be required!
location=$(STYLE=ITALIC style_ansi "$location")
printf "%40s\t%s\n" "${location}" "${functions[$i]}"
optional=true
done
}
function dump_failure {
dump_stderr true
debug '---stacktrace---'
@ -208,14 +247,18 @@ function dump_failure {
if [[ $failure_type == 'SUBSHELL ERROR' ]]; then
>&4 echo -e "${failure_payload}"
else
>&4 echo -e "\tCODE: ${code}"
>&4 echo -e "\tTYPE: ${failure_type}"
>&4 echo -e "\tPAYLOAD: ${failure_payload}"
declare -F style_ansi >/dev/null || source "$MIAOU_BASH_DIR/lib/ansi.bash"
>&4 ansi_block_error "$failure_type" "$failure_payload" "$code"
>&4 ansi_block_continuation
fi
fi
for i in "${failure_traces[@]}"; do
>&4 echo -e "$i"
done
declare -F style_ansi >/dev/null || source "$MIAOU_BASH_DIR/lib/ansi.bash"
>&4 ansi_traces stack_sources stack_lines stack_functions
# for i in "${failure_traces[@]}"; do
# >&4 echo -e "$i"
# done
debug '---end of stacktrace---'
cleanup
}

19
lib/ansi.bash

@ -4,6 +4,9 @@
PADDING=0
ANSI_RESET='\e[0m'
BLOCK_CONTINUATION_COL=
BLOCK_CONTINUATION_SYMBOL=
declare -A STYLE_VARIANTS
STYLE_VARIANTS[BOLD]='\e[1m'
STYLE_VARIANTS[ITALIC]='\e[3m'
@ -88,7 +91,7 @@ function style_ansi {
}
function style_block {
local content length top bottom
local content length top bottom i
content=$(style_padding "$1")
length=$(ansi_length "$content")
@ -97,16 +100,22 @@ function style_block {
for _ in $(seq 1 "${length}"); do builtin echo -n '═'; done
builtin echo "╗"
)
style_ansi "${top}" && echo
style_ansi "${top}" && builtin echo
style_ansi "║"
style_ansi "${content}"
style_ansi "║" && echo
style_ansi "║" && builtin echo
bottom=$(
builtin echo -n "╚"
for _ in $(seq 1 "${length}"); do builtin echo -n '═'; done
for i in $(seq 1 "${length}"); do
if [[ $i == "$BLOCK_CONTINUATION_COL" ]]; then
builtin echo -n "$BLOCK_CONTINUATION_SYMBOL"
else
builtin echo -n '═'
fi
done
builtin echo "╝"
)
style_ansi "${bottom}" && echo
style_ansi "${bottom}" && builtin echo
}

64
test/stub/ansi_error.bash

@ -1,21 +1,19 @@
#!/usr/bin/env miaou-bash
. "$MIAOU_BASH_DIR/lib/ansi.bash"
CODE=118
TYPE='SUBSHELL TERM'
PAYLOAD='blabla'
code=118
failure_type='SUBSHELL TERM'
failure_payload='blabla'
stack_sources=('file.bash' './lib/utility.bash' 'file.bash')
stack_lines=(18 56 12)
stack_functions=('f2' 'f1' '<main>')
function ansi_block_continuation {
tput sc
tput cuu 1
BG=RED FG=BLACK style_ansi "\t╦"
tput rc
FG=RED style_ansi "\t║\n"
}
# function ansi_block_continuation {
# tput sc
# tput cuu 1
# BG=RED FG=BLACK style_ansi "\t╦"
# tput rc
# FG=RED style_ansi "\t║\n"
# }
function ansi_block_error {
BG=RED
@ -24,30 +22,42 @@ function ansi_block_error {
local content detail exit_code
content=$(style_ansi "${TYPE}")
content=$(style_ansi "$1")
content=$(style_padding "$content")
detail=$(BG=BLACK style_padding "${PAYLOAD}")
exit_code=$(FG=WHITE style_ansi " ${CODE}")
style_block "$content$detail$exit_code"
detail=$(BG=BLACK style_padding "$2")
exit_code=$(FG=CYAN style_ansi " $3")
BLOCK_CONTINUATION_COL=5 style_block "$content$detail$exit_code"
ansi_reset
FG=RED style_ansi " ║"
echo
}
function ansi_traces {
local optional location
local optional location sources lines functions
declare -n sources=$1
declare -n lines=$2
declare -n functions=$3
optional=false
for i in "${!stack_sources[@]}"; do
FG=RED style_ansi "\t╟─⟶"
location="${stack_sources[$i]}:${stack_lines[$i]}"
for i in "${!sources[@]}"; do
FG=RED style_ansi " ╟─⟶"
location=$(printf "%40s" "${sources[$i]}:${lines[$i]}")
is_true "$optional" &&
location=$(FG=GRAY STYLE=ITALIC style_ansi "\t$location") || # FIXME: \t should not be required!
location=$(FG=GRAY STYLE=ITALIC style_ansi "$location") ||
location=$(STYLE=ITALIC style_ansi "$location")
printf "%40s\t%s\n" "${location}" "${stack_functions[$i]}"
builtin echo "${location} ${functions[$i]}"
optional=true
done
}
ansi_block_error
ansi_block_continuation
ansi_traces
function show_error {
>&2 printf '\r'
>&2 ansi_block_error "$failure_type" "$failure_payload" "$code"
>&2 ansi_traces stack_sources stack_lines stack_functions
# [[ -p /dev/stdout ]] && kill -TERM $$
}
declare -F style_ansi >/dev/null || source "$MIAOU_BASH_DIR/lib/ansi.bash"
echo START
# echo -n "standard flow:" && show_error
echo -n "starting subshell: $(show_error)"

4
test/stub/scenario.bash

@ -7,6 +7,10 @@ readonly BASEDIR
# SCENARII
function do_subshell_false {
result=$(false)
}
function do_subshell_term {
# grep nope nope
echo "found=$(command_not_found)"

Loading…
Cancel
Save