summaryrefslogtreecommitdiff
path: root/bos-args.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bos-args.sh')
-rw-r--r--bos-args.sh54
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
+}