144 lines
3.0 kB
1
#! /usr/bin/env sh
2
3
# ╭──────┬───────────╮
4
# │ main │ constants │
5
# ╰──────┴───────────╯
6
7
RWX_MAIN_NAME="main.sh"
8
RWX_SELF_NAME="rwx"
9
10
RWX_SELF_COMMAND="_${RWX_SELF_NAME}_cmd_"
11
12
# ╭──────┬───────────╮
13
# │ main │ variables │
14
# ╰──────┴───────────╯
15
16
RWX_COMMAND_ARGUMENT="${0}"
17
RWX_SHELL="$(cat "/proc/${$}/comm")"
18
19
RWX_COMMAND_NAME="$(basename "${RWX_COMMAND_ARGUMENT}" |
20
sed "s|^-||")"
21
case "${RWX_COMMAND_NAME}" in
22
"bash" | "dash" | "sh") unset RWX_COMMAND_NAME ;;
23
*) ;;
24
esac
25
RWX_ROOT_SYSTEM="/usr/local/lib/${RWX_SELF_NAME}"
26
RWX_SELF_USER="${HOME}/${RWX_SELF_NAME}"
27
28
RWX_MAIN_PATH="${RWX_ROOT_SYSTEM}/${RWX_MAIN_NAME}"
29
30
# ╭──────┬───────╮
31
# │ main │ shell │
32
# ╰──────┴───────╯
33
34
# test if active shell is in interactive mode
35
rwx_shell_interactive() {
36
case "${-}" in
37
*i*) ;;
38
*) return 1 ;;
39
esac
40
}
41
42
# ╭──────┬─────╮
43
# │ main │ log │
44
# ╰──────┴─────╯
45
46
__rwx_log() {
47
if rwx_shell_interactive; then
48
[ ${#} -gt 0 ] || set -- ""
49
local line
50
for line in "${@}"; do
51
echo "${line}"
52
done
53
fi
54
}
55
56
# ╭──────┬──────╮
57
# │ main │ find │
58
# ╰──────┴──────╯
59
60
# find directory’s files by extension
61
rwx_find_extension() {
62
local extension="${1}"
63
local root="${2}"
64
local file="${3}"
65
set -- \
66
"${root}" \
67
-name "*.${extension}" \
68
-type "f"
69
[ -n "${file}" ] &&
70
set -- "${@}" \
71
-not \
72
-name "${file}"
73
find "${@}" \
74
-printf "%P\n" |
75
sort
76
}
77
78
# find directory’s sh files
79
rwx_find_shell() {
80
rwx_find_extension "sh" "${@}"
81
}
82
83
# ╭──────┬─────╮
84
# │ main │ ifs │
85
# ╰──────┴─────╯
86
87
rwx_ifs_set() {
88
_RWX_IFS="${IFS}"
89
IFS="
90
"
91
}
92
93
rwx_ifs_unset() {
94
IFS="${_RWX_IFS}"
95
unset RWX_IFS
96
}
97
98
# ╭──────┬────────╮
99
# │ main │ source │
100
# ╰──────┴────────╯
101
102
rwx_source() {
103
local path="${1}"
104
[ -d "${path}" ] ||
105
return 1
106
local count module
107
count=0
108
__rwx_log "" \
109
". ${path}"
110
rwx_ifs_set
111
for module in $(rwx_find_shell "${path}" "${RWX_MAIN_NAME}"); do
112
count=$((count + 1))
113
__rwx_log "$(printf "%02d" "${count}") ${module%.sh}"
114
module="${path}/${module}"
115
# shellcheck disable=SC1090
116
. "${module}"
117
done
118
rwx_ifs_unset
119
}
120
121
# ╭──────╮
122
# │ main │
123
# ╰──────╯
124
125
# run initial steps
126
rwx_main() {
127
# system root
128
if ! rwx_source "${RWX_ROOT_SYSTEM}"; then
129
__rwx_log "Not a directory: ${RWX_ROOT_SYSTEM}"
130
return 1
131
fi
132
# user root
133
rwx_source "${RWX_SELF_USER}"
134
# context / command
135
if [ -n "${RWX_COMMAND_NAME}" ]; then
136
"${RWX_SELF_COMMAND}${RWX_COMMAND_NAME}" "${@}"
137
# context / shell
138
else
139
rwx_self_init
140
fi
141
}
142
143
# run main function
144
rwx_main "${@}"
145