diff options
Diffstat (limited to 'bos-args.sh')
-rw-r--r-- | bos-args.sh | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/bos-args.sh b/bos-args.sh new file mode 100644 index 0000000..e0f0729 --- /dev/null +++ b/bos-args.sh @@ -0,0 +1,54 @@ +#!bash + +function bos-args/build-parser-code-into() { + local -n parser_result_var="$1"; shift + + local -A argvar argtype assignment + while [[ "${#@}" -gt 0 ]]; do + case "$1" in + -scalar|-array|-assoc) + argtype["$2"]="${1#-}"; + argvar["$2"]="$3"; + shift 3 + ;; + -assignment-*) + assignment["${1#-assignment-}"]="$2"; + shift 2 + ;; + *) + >&2 echo "bad argument <$1>"; + return 1 + ;; + esac + done + + parser_result_var="while [[ \"\${#@}\" -gt 0 ]]; do +case \"\$1\" in +" + + local argassign + for argname in "${!argvar[@]}"; do + argassign="${assignment["${argtype["$argname"]}"]}" + argassign="${argassign//\$\{name\}/${argvar["$argname"]}}" + + if [[ "${argtype["$argname"]}" == scalar || "${argtype["$argname"]}" == array ]]; then + argassign="${argassign//\$\{value/\$\{2}" + + parser_result_var+="-${argname}) $argassign; shift 2 ;; +" + elif [[ "${argtype["$argname"]}" == assoc ]]; then + argassign="${argassign//\$\{key/\$\{2}" + argassign="${argassign//\$\{value/\$\{3}" + + parser_result_var+="-${argname}) $argassign; shift 3 ;; +" + fi + done + + parser_result_var+="*) shift ;; +esac +done +" + + return 0 +} |