#! /usr/bin/env sh # main module # ╭──────╮ # │ main │ # ╰──────╯ # ╭──────┬───────────╮ # │ main │ constants │ # ╰──────┴───────────╯ # name of the entrypoint file RWX_MAIN_NAME="main.sh" RWX_SELF_NAME="rwx" RWX_SELF_COMMAND="_${RWX_SELF_NAME}_cmd_" # ╭──────┬───────────╮ # │ main │ variables │ # ╰──────┴───────────╯ RWX_COMMAND_ARGUMENT="${0}" RWX_SHELL="$(cat "/proc/${$}/comm")" RWX_COMMAND_NAME="$(basename "${RWX_COMMAND_ARGUMENT}" | sed "s|^-||")" case "${RWX_COMMAND_NAME}" in "bash" | "dash" | "sh") unset RWX_COMMAND_NAME ;; *) ;; esac RWX_ROOT_SYSTEM="/usr/local/lib/${RWX_SELF_NAME}" RWX_SELF_USER="${HOME}/${RWX_SELF_NAME}" RWX_MAIN_PATH="${RWX_ROOT_SYSTEM}/${RWX_MAIN_NAME}" # ╭──────┬──────╮ # │ main │ main │ # ╰──────┴──────╯ # run initial steps rwx_main() { # cache main rwx_cache "${RWX_ROOT_SYSTEM}" "${RWX_MAIN_NAME}" # source system root 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_code # context / command if [ -n "${RWX_COMMAND_NAME}" ]; then "${RWX_SELF_COMMAND}${RWX_COMMAND_NAME}" "${@}" # context / shell else rwx_self_init fi } # ╭──────┬───────╮ # │ main │ cache │ # ╰──────┴───────╯ RWX_CODE="" # cache source code of a module rwx_cache() { local root="${1}" local module="${2}" local name="${module%.sh}" local path="${root}/${module}" local text text="$(cat "${path}")" RWX_CODE="${RWX_CODE}\ #↓ ${name} ${text} " } # ╭──────┬────────╮ # │ main │ source │ # ╰──────┴────────╯ # source code from file path rwx_source() { local root="${1}" [ -d "${root}" ] || return 1 local file="${2}" local count module count=0 __rwx_log "" \ ". ${root}" local modules="$(rwx_find_shell "${root}" "${file}")" while IFS= read -r module; do count=$((count + 1)) __rwx_log "$(printf "%02d" "${count}") ${module%.sh}" # shellcheck disable=SC1090 . "${root}/${module}" # cache code rwx_cache "${root}" "${module}" done <