#!/usr/bin/env bash

# Try / catch in bash
#
# ````
# #!/bin/bash
# export AnException=100
# export AnotherException=101
#
# # start with a try
# try
# (   # open a subshell !!!
#     echo "do something"
#     [ someErrorCondition ] && throw $AnException
#
#     echo "do something more"
#     executeCommandThatMightFail || throw $AnotherException
#
#     throwErrors # automaticatly end the try block, if command-result is non-null
#     echo "now on to something completely different"
#     executeCommandThatMightFail
#
#     echo "it's a wonder we came so far"
#     executeCommandThatFailsForSure || true # ignore a single failing command
#
#     ignoreErrors # ignore failures of commands until further notice
#     executeCommand1ThatFailsForSure
#     local result = $(executeCommand2ThatFailsForSure)
#     [ result != "expected error" ] && throw $AnException # ok, if it's not an expected error, we want to bail out!
#     executeCommand3ThatFailsForSure
#
#     # make sure to clear $ex_code, otherwise catch * will run
#     # echo "finished" does the trick for this example
#     echo "finished"
# )
# # directly after closing the subshell you need to connect a group to the catch using ||
# catch || {
#     # now you can handle
#     case $ex_code in
#         $AnException)
#             echo "AnException was thrown"
#         ;;
#         $AnotherException)
#             echo "AnotherException was thrown"
#         ;;
#         *)
#             echo "An unexpected exception was thrown"
#             throw $ex_code # you can rethrow the "exception" causing the script to exit if not caught
#         ;;
#     esac
# }
# ```
# Source: https://stackoverflow.com/a/25180186`

# shellcheck disable=SC2034
Logger="${BASH_SOURCE[0]}../log"

# @description Turn on fail on errors mode
function try() {
    [[ $- = *e* ]]; SAVED_OPT_E=$?
    set +e
}

# @description Turn on fail on errors mode
function throw() {
    exit "$1"
}

# @description Turn on fail on errors mode
function catch() {
    export ex_code=$?
    # shellcheck disable=SC2004
    (( $SAVED_OPT_E )) && set +e
    return $ex_code
}

# @description Turn on fail on errors mode
function throwErrors() {
    set -e
}

# @description Do not fail on errors mode
function ignoreErrors() {
    set +e
}