diff --git a/sh/main.sh b/sh/main.sh index 63ca6bf..d75695b 100755 --- a/sh/main.sh +++ b/sh/main.sh @@ -37,13 +37,17 @@ RWX_MAIN_PATH="${RWX_ROOT_SYSTEM}/${RWX_MAIN_NAME}" # run initial steps rwx_main() { + # cache main + rwx_cache "${RWX_ROOT_SYSTEM}" "${RWX_MAIN_NAME}" # source system root - if ! rwx_source "${RWX_ROOT_SYSTEM}"; then + if ! rwx_source "${RWX_ROOT_SYSTEM}" "${RWX_MAIN_NAME}"; then __rwx_log "Not a directory: ${RWX_ROOT_SYSTEM}" return 1 fi # source user root rwx_source "${RWX_SELF_USER}" + # parse code cache + rwx_parse # context / command if [ -n "${RWX_COMMAND_NAME}" ]; then "${RWX_SELF_COMMAND}${RWX_COMMAND_NAME}" "${@}" @@ -53,26 +57,72 @@ rwx_main() { fi } +# ╭──────┬───────╮ +# │ main │ cache │ +# ╰──────┴───────╯ + +rwx_cache() { + local root="${1}" + local module="${2}" + local name="${module%.sh}" + local path="${root}/${module}" + local fill text + fill="$(rwx_fill "${#name}" ─)" + text="$(cat "${path}")" + case "${text}" in + "#!"*) + RWX_CODE="${text} + +# ╭───┬────┬─${fill}─╮ +# │ ↖ │ sh │ ${name} │ +# ╰───┴────┴─${fill}─╯" + ;; + *) + RWX_CODE="${RWX_CODE} + +# ╭───┬────┬─${fill}─╮ +# │ ↙ │ sh │ ${name} │ +# ╰───┴────┴─${fill}─╯ + +${text}" + ;; + esac +} + +# ╭──────┬──────╮ +# │ main │ fill │ +# ╰──────┴──────╯ + +rwx_fill() { + local index="${1}" + while [ "${index}" -gt 0 ]; do + printf "%s" "${2}" + index=$((index - 1)) + done +} + # ╭──────┬────────╮ # │ main │ source │ # ╰──────┴────────╯ # source code from file path rwx_source() { - local path="${1}" - [ -d "${path}" ] || + local root="${1}" + [ -d "${root}" ] || return 1 + local file="${2}" local count module count=0 __rwx_log "" \ - ". ${path}" + ". ${root}" rwx_ifs_set - for module in $(rwx_find_shell "${path}" "${RWX_MAIN_NAME}"); do + for module in $(rwx_find_shell "${root}" "${file}"); do count=$((count + 1)) __rwx_log "$(printf "%02d" "${count}") ${module%.sh}" - module="${path}/${module}" # shellcheck disable=SC1090 - . "${module}" + . "${root}/${module}" + # cache code + rwx_cache "${root}" "${module}" done rwx_ifs_unset } @@ -147,6 +197,36 @@ rwx_find_shell() { rwx_find_extension "sh" "${@}" } +# ╭──────┬───────╮ +# │ main │ parse │ +# ╰──────┴───────╯ + +rwx_parse() { + local ws="[[:space:]]*" + local start="^${ws}" + local constant="[_A-Z][_0-9A-Z]*" + local setting="=.*" + local fn="${ws}(${ws})${ws}{" + local id="[_a-zA-Z][_a-z0-9A-Z]*" + local line + rwx_ifs_set + RWX_CONSTANTS="" + for line in $(echo "${RWX_CODE}" | + grep "${start}${constant}${setting}" | + sed "s|${start}\\(${constant}\\)${setting}|\\1|"); do + RWX_CONSTANTS="${RWX_CONSTANTS}${line} +" + done + RWX_FUNCTIONS="" + for line in $(echo "${RWX_CODE}" | + grep "${start}${id}${fn}" | + sed "s|${start}\\(${id}\\)${fn}.*|\\1|"); do + RWX_FUNCTIONS="${RWX_FUNCTIONS}${line} +" + done + rwx_ifs_unset +} + # ╭──────┬─────╮ # │ main │ run │ # ╰──────┴─────╯ diff --git a/sh/util.sh b/sh/util.sh index 38fe29a..13c70f5 100644 --- a/sh/util.sh +++ b/sh/util.sh @@ -49,11 +49,9 @@ rwx_remove() { } rwx_root() { - if [ "$(id --user)" -eq 0 ]; then - return 0 - else - return 1 - fi + local user_id + user_id="$(id --user)" + [ "${user_id}" -eq 0 ] || return 1 } rwx_warn_wipe() {