summaryrefslogtreecommitdiff
path: root/bos-args.sh
blob: dfe4be23ad8b758a4a9e9c372bbaf04ca06df63e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!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
                ;;
            *)
                bos/log 1 "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/\$\{__args_key}"
            argassign="${argassign//\$\{value/\$\{__args_value}"
 
            parser_result_var+="-${argname}) IFS='=' read -s __args_key __args_value <<<\"\$2\"; $argassign; shift 2 ;;
"
        fi
    done
 
    # ignore anything else!
    parser_result_var+="*shift ;;
esac
done
"
 
    return 0
}