Skip to content

Instantly share code, notes, and snippets.

@egg82
Created October 11, 2022 05:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save egg82/87899d149fa9bf47e34d4b8c04682b7d to your computer and use it in GitHub Desktop.
Save egg82/87899d149fa9bf47e34d4b8c04682b7d to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
# https://stackoverflow.com/questions/51653450/show-call-stack-in-bash
stacktrace () {
local i=1 line file func
while read -r line func file < <(caller ${i}); do
echo >&2 "[${i}] ${file}:${line} ${func}()"
echo >&2 ">>> $(sed -n "${line}"p "${file}")"
((i++))
done
}
export -f stacktrace
# Levels
# 0 = debug
# 1 = info
# 2 = warning
# 3 = error
print () {
local level="${1}"
local string="${2}"
if [[ "${level}" -lt 0 ]] || [[ "${level}" -gt 3 ]]; then
echo >&2 "[ERROR] Print level ${level} must be between 0 and 3 (inclusive)" # No recursive calls here!
stacktrace
return 1
fi
if [[ "${level}" = 3 ]]; then
echo >&2 "[ERROR] ${string}"
stacktrace
elif [[ "${level}" = 2 ]]; then
echo "[WARN] ${string}"
elif [[ "${level}" = 1 ]] && ${INFO_ENABLED}; then
echo "[INFO] ${string}"
elif [[ "${level}" = 0 ]] && ${DEBUG_ENABLED}; then
echo "[DEBUG] ${string}"
fi
}
export -f print
lang_transform () {
local string="${1}"
local args=("${@:2}")
local args_len_mod=$(( "${#args[@]}" / 2 ))
local i
if (( "${#args[@]}" % 2 )); then
print 3 "lang_transform arg length is not divisible by 2: ${#args[@]}" # No recursive calls here!
return 1
fi
for (( i = 0; i < args_len_mod; i += 2 )); do
local escaped
escaped="$(printf '%s\n' "${args[i]}" | sed -e 's/[]\/$*.^[]/\\&/g')" # Escape possible regex in search
string="${string//${escaped}/${args[((i+1))]}}"
done
echo "${string}" # Return string value
}
export -f lang_transform
var_is_set () {
local global="${1}"
if [[ -z "${!global+x}" ]]; then
return 1
else
return 0
fi
}
export -f var_is_set
var_is_set_error () {
local global="${1}"
if ! var_is_set "${global}"; then
print 3 "$(lang_transform "${LANG_VAR_NOT_SET}" "{var}" "${global}")"
return 1
fi
}
export -f var_is_set_error
register () {
local var_name="${1}"
local var_value="${2}"
if ! var_is_set_error "TMP_DIR"; then return $?; fi
print 0 "register ${var_name}=${var_value}"
echo "'${var_name} ${var_value}'" | tee -a "${TMP_DIR}/registry.txt" &>/dev/null
}
export -f register
retrieve () {
local pattern="${1}"
if ! var_is_set_error "TMP_DIR"; then return $?; fi
if [[ -z "${pattern}" ]]; then
pattern=".*"
fi
if [[ ! "${pattern::1}" = "^" ]]; then
pattern="^${pattern}"
fi
if [[ ! "${pattern:-1}" = "$" ]]; then
pattern="${pattern}$"
fi
while read -r line; do
read -r -a arr <<< "${line}"
local vn="${arr[0]:1}"
local vv="${arr[1]::-1}"
if [[ "${vn}" =~ ${pattern} ]]; then
local n="${vn##*.}"
export "${n}"="${vv}"
print 0 "export ${n}=${vv}"
fi
done < "${TMP_DIR}/registry.txt"
}
export -f retrieve
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment