Add & implement askNecessaryQuestions

This commit is contained in:
Rezart Qelibari
2022-02-04 14:10:57 +01:00
parent 366047fb20
commit 948f995f57
5 changed files with 389 additions and 1 deletions

View File

@@ -19,7 +19,7 @@ function getFilteredModules() {
if [ "${#module}" -eq 0 ]; then
echo "${allModules[@]}"
else
local modulesToKeep=()
local mod modulesToKeep=()
for mod in "${allModules[@]}"; do
local foundAtIndex="${module[(Ie)${mod}]}"
if [ "${inverse}" != 'true' -a "${foundAtIndex}" -gt 0 ]; then
@@ -32,6 +32,130 @@ function getFilteredModules() {
fi
}
function runModule() {
local mod="$1"
shift
${_DIR:-.}/${mod} "$@"
}
function parseQuestionLine() {
local questionType parameterName question value arguments args
local -A typeMap=([i]=info [p]=password [c]=confirm [s]=select)
[ -z "${line}" ] && return
[ "${line[2]}" != ':' ] && return 10
questionType="${typeMap[${line[1]}]}"
[ -z "${questionType}" ] && return 11
# remove question type
[ "${line[3]}" = ' ' ] && line="${line:3}" || line="${line:2}"
line=("${(s.=.)line[@]}")
parameterName="${line[1]}"
[ -z "${parameterName}" ] && return 12
[ "${parameterName[1]}" = '-' ] && return 13
# remove parameter name
line="${(j.=.)${(@)line:1}}"
line=("${(s. #.)line}")
question="${line[1]}"
[ -z "${question}" ] && return 14
# remove question part
line="${(j. #.)${(@)line:1}}"
if [ -n "${line}" ]; then
arguments=("${(s.;.)line}")
for arg in "${arguments[@]}"; do
arg=("${(s.:.)arg}")
[ -z "${arg[1]}" ] && return 15
arg[1]="`trim "${arg[1]}"`"
arg[2]="`trim "${arg[2]}"`"
questionType+=";${(j.:.)arg}"
done
fi
printf -v value '%s\n%s' "${question}" "${questionType}"
questions+=("${parameterName}" "${value}")
}
function populateQuestionsWithModuleRequiredInformation() {
for line in "${(f)$(runModule "${mod}" --show-required-information)}"; do
parseQuestionLine
done
}
function convertQuestionArgsToAskUserArgs() {
local arg argName argValue
local instructions=("${(s.;.)questionArgs}")
local questionType="${instructions[1]}"
shift instructions
if [ "${questionType}" = 'info' ]; then
args=(info)
elif [ "${questionType}" = 'password' ]; then
args=('-p' info)
elif [ "${questionType}" = 'confirm' ]; then
args=(confirm)
elif [ "${questionType}" = 'select' ]; then
for arg in "${instructions[@]}"; do
arg=("${(s.:.)arg}")
[ "${#arg}" -lt 2 ] && continue
argName="${arg[1]}"
argValue="${arg[2]}"
[ "${argName}" != 'choose from' ] && continue
choices=("${(s.,.)argValue}")
done
[ "${#choices}" -ge 1 ] || return 10
args=(choose)
fi
}
function askUserQuestion() {
local choices
local questionAndArgs=("${(f)questions[$questionID]}") args=()
local question="${questionAndArgs[1]}" questionArgs="${questionAndArgs[2]}"
convertQuestionArgsToAskUserArgs
askUser "${args[@]}" "${question}"
value="${REPLY}"
}
function generateConfigKeysFromQuestionID() {
setopt localoptions extendedglob
[ $# -lt 2 -o -z "$1" -o -z "$2" ] && return
local modName="${1}" questID="${2}"
modName="${${${${modName//-##/_}/#_/}/%_/}//[^A-Za-z_]/}"
questID="${${${${questID//-##/_}/#_/}/%_/}//[^A-Za-z_]/}"
configkeys=("${modName}" questions "${questID}")
}
function answerQuestionsFromConfigOrAskUser() {
local questionID
config setappname "de.astzweig.macos.system-setup"
for questionID in "${(k)questions[@]}"; do
local value configkeys=()
generateConfigKeysFromQuestionID "${mod}" "${questionID}"
value="`config read "${configkeys[@]}"`"
if [ -z "${value}" ]; then
askUserQuestion
config write "${value}" "${configkeys[@]}"
fi
answers+=("${mod}_${questionID}" "${value}")
done
}
function askNecessaryQuestions() {
local mod
local -A answers
for mod in "${modulesToInstall[@]}"; do
local -A questions=()
populateQuestionsWithModuleRequiredInformation
answerQuestionsFromConfigOrAskUser
done
}
function main() {
eval "`docopts -f -V - -h - : "$@" <<- USAGE
Usage: $0 [options] [<module>...]
@@ -50,9 +174,11 @@ function main() {
local modulesToInstall=(`getFilteredModules`)
ensureDocopts
autoloadZShLib
askNecessaryQuestions
hio debug "Current working dir is: `pwd`"
}
if [[ "${ZSH_EVAL_CONTEXT}" == toplevel ]]; then
_DIR="${0:A:h}"
main
fi