#! /usr/bin/env sh # ╭──────╮ # │ main │ # ╰──────╯ # main module # * builtins # * echo # * printf # * read # * binaries # * awk # * cat # * find # * sed # ╭──────┬───────────╮ # │ main │ constants │ # ╰──────┴───────────╯ # name of the entrypoint file RWX_MAIN_NAME="main.sh" # name of the project itself RWX_SELF_NAME="rwx" # ╭──────┬───────────╮ # │ main │ variables │ # ╰──────┴───────────╯ # cache of all sourced code modules _rwx_code="" # system root directory of the project RWX_ROOT_SYSTEM="/usr/local/lib/${RWX_SELF_NAME}" # user root directory of the project RWX_SELF_USER="${HOME}/${RWX_SELF_NAME}" # path to the entrypoint main file of the project RWX_MAIN_PATH="${RWX_ROOT_SYSTEM}/${RWX_MAIN_NAME}" # ╭──────┬───────╮ # │ main │ shell │ # ╰──────┴───────╯ # test if active shell is in interactive mode rwx_shell_interactive() { case "${-}" in *i*) ;; *) return 1 ;; esac } # ╭──────┬──────╮ # │ main │ find │ # ╰──────┴──────╯ # find directory’s files by extension rwx_find_extension() { local extension="${1}" local root="${2}" local file="${3}" set -- \ "${root}" \ -name "*.${extension}" \ -type "f" [ -n "${file}" ] && set -- "${@}" \ -not \ -name "${file}" find "${@}" \ -printf "%P\n" | sort } # find directory’s sh files rwx_find_shell() { rwx_find_extension "sh" "${@}" } ################################################################################ # ╭──────┬─────╮ # │ main │ log │ # ╰──────┴─────╯ __rwx_log() { if rwx_shell_interactive; then [ ${#} -gt 0 ] || set -- "" local line for line in "${@}"; do echo "${line}" done fi } # ╭──────┬────────╮ # │ main │ source │ # ╰──────┴────────╯ # source code from file path rwx_source() { local root="${1}" [ -d "${root}" ] || return 1 local file="${2}" local count module modules count=0 __rwx_log "" \ ". ${root}" 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 < cat rwx_cache() { local root="${1}" local module="${2}" local name="${module%.sh}" local path="${root}/${module}" local text text="$(cat "${path}")" # all source code _rwx_code="${_rwx_code}\ #. ${name} ${text} " } # ╭──────┬──────╮ # │ 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}" # load code cache rwx_code_load # context / command local command # command name used to run # (stripped from hyphen interactive flag) command="$(basename "${0}" | sed "s|^-||")" case "${command}" in "bash" | "dash" | "sh") unset command ;; *) ;; esac if [ -n "${command}" ]; then local function # find the matching function function="$(rwx_code_alias_function "${command}")" if [ -n "${function}" ]; then "${function}" "${@}" fi # context / shell else rwx_self_init fi } # ╭──────┬─────╮ # │ main │ run │ # ╰──────┴─────╯ # run main function rwx_main "${@}"