diff --git a/src/lib.sh b/src/lib.sh index c3a034c..e59a169 100644 --- a/src/lib.sh +++ b/src/lib.sh @@ -4,7 +4,7 @@ std::bootstrap() { declare -g STD_VERSION=$1 } -std::bootstrap 0.1.2 +std::bootstrap 0.1.3 INTERPRETER=$(ps -p $$ | awk '$1 != "PID" {print $(NF)}') : "${INTERPRETER:=bash}" @@ -134,8 +134,11 @@ std::mod::source() { elif ! [[ "$joined_path" == *.sh ]]; then std::mod::source "$module_name" "$import_path.sh" else - echo "$joined_path path not found" - std::panic "$joined_path path not found" + if command -v std::panic &>/dev/null; then + std::panic "$joined_path path not found" + else + echo "$joined_path path not found" + fi fi # condition diff --git a/src/mod/core.sh b/src/mod/core.sh index 27c5350..f293071 100644 --- a/src/mod/core.sh +++ b/src/mod/core.sh @@ -6,6 +6,20 @@ std::wprintln() { printf "\033[1;33m%s\033[0m\n" "$*" >&2 } +std::backtrace() { + if ! std::interpreter::is-bash; then + std::eprintln "Backtraces are only available for bash" + exit 1 + fi + + std::eprintln + std::eprintln $'\033[4m'"Backtrace:" + + for i in "${!FUNCNAME[@]}"; do + std::eprintln " ${FUNCNAME[$i]} called at ${BASH_SOURCE[$i]}:${BASH_LINENO[$i - 1]}" + done +} + std::panic() { if [ -n "${1:-}" ]; then local arg1=$1 @@ -15,6 +29,8 @@ std::panic() { std::eprintln "code panicked" fi + [ -z "${SH_BACKTRACE:-}" ] || std::backtrace + exit 1 }