source: trunk/debian/packages/libubox/trunk/sh/jshn.sh @ 857

Last change on this file since 857 was 857, checked in by amain, 4 years ago

libubox: initial import / part 4

File size: 4.7 KB
Line 
1# functions for parsing and generating json
2
3_json_get_var() {
4        # dest=$1
5        # var=$2
6        eval "$1=\"\$${JSON_PREFIX}$2\""
7}
8
9_json_set_var() {
10        # var=$1
11        local ___val="$2"
12        eval "${JSON_PREFIX}$1=\"\$___val\""
13}
14
15__jshn_raw_append() {
16        # var=$1
17        local value="$2"
18        local sep="${3:- }"
19
20        eval "export -- \"$1=\${$1:+\${$1}\${value:+\$sep}}\$value\""
21}
22
23_jshn_append() {
24        # var=$1
25        local _a_value="$2"
26        eval "${JSON_PREFIX}$1=\"\${${JSON_PREFIX}$1} \$_a_value\""
27}
28
29_get_var() {
30        # var=$1
31        # value=$2
32        eval "$1=\"\$$2\""
33}
34
35_set_var() {
36        # var=$1
37        local __val="$2"
38        eval "$1=\"\$__val\""
39}
40
41_json_inc() {
42        # var=$1
43        # dest=$2
44
45        let "${JSON_PREFIX}$1 += 1" "$2 = ${JSON_PREFIX}$1"
46}
47
48_json_add_generic() {
49        # type=$1
50        # name=$2
51        # value=$3
52        # cur=$4
53
54        local var
55        if [ "${4%%[0-9]*}" = "J_A" ]; then
56                _json_inc "S_$4" var
57        else
58                var="${2//[^a-zA-Z0-9_]/_}"
59                [[ "$var" == "$2" ]] || export -- "${JSON_PREFIX}N_${4}_${var}=$2"
60        fi
61
62        export -- \
63                "${JSON_PREFIX}${4}_$var=$3" \
64                "${JSON_PREFIX}T_${4}_$var=$1"
65        _jshn_append "JSON_UNSET" "${4}_$var"
66        _jshn_append "K_$4" "$var"
67}
68
69_json_add_table() {
70        # name=$1
71        # type=$2
72        # itype=$3
73        local cur seq
74
75        _json_get_var cur JSON_CUR
76        _json_inc JSON_SEQ seq
77
78        local table="J_$3$seq"
79        _json_set_var "U_$table" "$cur"
80        export -- "${JSON_PREFIX}K_$table="
81        unset "${JSON_PREFIX}S_$table"
82        _json_set_var JSON_CUR "$table"
83        _jshn_append "JSON_UNSET" "$table"
84
85        _json_add_generic "$2" "$1" "$table" "$cur"
86}
87
88_json_close_table() {
89        local _s_cur
90
91        _json_get_var _s_cur JSON_CUR
92        _json_get_var "${JSON_PREFIX}JSON_CUR" "U_$_s_cur"
93}
94
95json_set_namespace() {
96        local _new="$1"
97        local _old="$2"
98
99        [ -n "$_old" ] && _set_var "$_old" "$JSON_PREFIX"
100        JSON_PREFIX="$_new"
101}
102
103json_cleanup() {
104        local unset tmp
105
106        _json_get_var unset JSON_UNSET
107        for tmp in $unset J_V; do
108                unset \
109                        ${JSON_PREFIX}U_$tmp \
110                        ${JSON_PREFIX}K_$tmp \
111                        ${JSON_PREFIX}S_$tmp \
112                        ${JSON_PREFIX}T_$tmp \
113                        ${JSON_PREFIX}N_$tmp \
114                        ${JSON_PREFIX}$tmp
115        done
116
117        unset \
118                ${JSON_PREFIX}JSON_SEQ \
119                ${JSON_PREFIX}JSON_CUR \
120                ${JSON_PREFIX}JSON_UNSET
121}
122
123json_init() {
124        json_cleanup
125        export -n ${JSON_PREFIX}JSON_SEQ=0
126        export -- \
127                ${JSON_PREFIX}JSON_CUR="J_V" \
128                ${JSON_PREFIX}K_J_V=
129}
130
131json_add_object() {
132        _json_add_table "$1" object T
133}
134
135json_close_object() {
136        _json_close_table
137}
138
139json_add_array() {
140        _json_add_table "$1" array A
141}
142
143json_close_array() {
144        _json_close_table
145}
146
147json_add_string() {
148        local cur
149        _json_get_var cur JSON_CUR
150        _json_add_generic string "$1" "$2" "$cur"
151}
152
153json_add_int() {
154        local cur
155        _json_get_var cur JSON_CUR
156        _json_add_generic int "$1" "$2" "$cur"
157}
158
159json_add_boolean() {
160        local cur
161        _json_get_var cur JSON_CUR
162        _json_add_generic boolean "$1" "$2" "$cur"
163}
164
165json_add_double() {
166        local cur
167        _json_get_var cur JSON_CUR
168        _json_add_generic double "$1" "$2" "$cur"
169}
170
171# functions read access to json variables
172
173json_load() {
174        eval "`jshn -r "$1"`"
175}
176
177json_dump() {
178        jshn "$@" ${JSON_PREFIX:+-p "$JSON_PREFIX"} -w
179}
180
181json_get_type() {
182        local __dest="$1"
183        local __cur
184
185        _json_get_var __cur JSON_CUR
186        local __var="${JSON_PREFIX}T_${__cur}_${2//[^a-zA-Z0-9_]/_}"
187        eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
188}
189
190json_get_keys() {
191        local __dest="$1"
192        local _tbl_cur
193
194        if [ -n "$2" ]; then
195                json_get_var _tbl_cur "$2"
196        else
197                _json_get_var _tbl_cur JSON_CUR
198        fi
199        local __var="${JSON_PREFIX}K_${_tbl_cur}"
200        eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
201}
202
203json_get_values() {
204        local _v_dest="$1"
205        local _v_keys _v_val _select=
206        local _json_no_warning=1
207
208        unset "$_v_dest"
209        [ -n "$2" ] && {
210                json_select "$2" || return 1
211                _select=1
212        }
213
214        json_get_keys _v_keys
215        set -- $_v_keys
216        while [ "$#" -gt 0 ]; do
217                json_get_var _v_val "$1"
218                __jshn_raw_append "$_v_dest" "$_v_val"
219                shift
220        done
221        [ -n "$_select" ] && json_select ..
222
223        return 0
224}
225
226json_get_var() {
227        local __dest="$1"
228        local __cur
229
230        _json_get_var __cur JSON_CUR
231        local __var="${JSON_PREFIX}${__cur}_${2//[^a-zA-Z0-9_]/_}"
232        eval "export -- \"$__dest=\${$__var:-$3}\"; [ -n \"\${$__var+x}\${3+x}\" ]"
233}
234
235json_get_vars() {
236        while [ "$#" -gt 0 ]; do
237                local _var="$1"; shift
238                if [ "$_var" != "${_var#*:}" ]; then
239                        json_get_var "${_var%%:*}" "${_var%%:*}" "${_var#*:}"
240                else
241                        json_get_var "$_var" "$_var"
242                fi
243        done
244}
245
246json_select() {
247        local target="$1"
248        local type
249        local cur
250
251        [ -z "$1" ] && {
252                _json_set_var JSON_CUR "J_V"
253                return 0
254        }
255        [[ "$1" == ".." ]] && {
256                _json_get_var cur JSON_CUR
257                _json_get_var cur "U_$cur"
258                _json_set_var JSON_CUR "$cur"
259                return 0
260        }
261        json_get_type type "$target"
262        case "$type" in
263                object|array)
264                        json_get_var cur "$target"
265                        _json_set_var JSON_CUR "$cur"
266                ;;
267                *)
268                        [ -n "$_json_no_warning" ] || \
269                                echo "WARNING: Variable '$target' does not exist or is not an array/object"
270                        return 1
271                ;;
272        esac
273}
274
275json_is_a() {
276        local type
277
278        json_get_type type "$1"
279        [ "$type" = "$2" ]
280}
Note: See TracBrowser for help on using the repository browser.