jshn: add json_get_values (useful for arrays)
[project/libubox.git] / sh / jshn.sh
index 242e5a4..e919910 100644 (file)
@@ -12,6 +12,15 @@ _json_set_var() {
        eval "${JSON_PREFIX}$___var=\"\$___val\""
 }
 
+__jshn_raw_append() {
+       local var="$1"
+       local value="$2"
+       local sep="${3:- }"
+
+       eval "export -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\""
+}
+
+
 _jshn_append() {
        local __var="$1"
        local __value="$2"
@@ -52,12 +61,12 @@ _set_var() {
 _json_inc() {
        local _var="$1"
        local _dest="$2"
-       local seq
+       local _seq
 
-       _json_get_var seq "$_var"
-       seq="$((${seq:-0} + 1))"
-       _json_set_var "$_var" "$seq"
-       [ -n "$dest" ] && _set_var "$_dest" "$seq"
+       _json_get_var _seq "$_var"
+       _seq="$((${_seq:-0} + 1))"
+       _json_set_var "$_var" "$_seq"
+       [ -n "$_dest" ] && _set_var "$_dest" "$_seq"
 }
 
 _json_stack_push() {
@@ -95,6 +104,7 @@ _json_add_table() {
        local type="$2"
        local itype="$3"
        local cur new_cur
+       local seq
 
        _json_get_var cur JSON_CUR
        _json_inc JSON_SEQ seq
@@ -102,18 +112,18 @@ _json_add_table() {
        local table="JSON_$itype$seq"
        _json_export "UP_$table" "$cur"
        _json_export "KEYS_$table" ""
-       [ "$TYPE" = "ARRAY" ] && _json_export "KEYS_$table" ""
+       [ "$itype" = "ARRAY" ] && _json_export "SEQ_$table" ""
        _json_stack_push "$table"
 
        _json_get_var new_cur JSON_CUR
-       _json_add_generic object "$1" "$new_cur" "$cur"
+       _json_add_generic "$type" "$1" "$new_cur" "$cur"
 }
 
 _json_close_table() {
        local stack new_stack
 
        _json_get_var stack JSON_STACK
-       _json_set_var cur "${JSON_STACK##* }"
+       _json_set_var JSON_CUR "${stack##* }"
        new_stack="${stack% *}"
        [[ "$stack" == "$new_stack" ]] && new_stack=
        _json_set_var JSON_STACK "$new_stack"
@@ -181,6 +191,10 @@ json_add_boolean() {
        _json_add_generic boolean "$1" "$2"
 }
 
+json_add_double() {
+       _json_add_generic double "$1" "$2"
+}
+
 # functions read access to json variables
 
 json_load() {
@@ -192,12 +206,37 @@ json_dump() {
 }
 
 json_get_type() {
-       local dest="$1"
-       local cur
+       local __dest="$1"
+       local __cur
 
-       _json_get_var cur JSON_CUR
-       local var="${JSON_PREFIX}TYPE_${cur}_$2"
-       eval "export -- \"$dest=\${$var}\"; [ -n \"\${$var+x}\" ]"
+       _json_get_var __cur JSON_CUR
+       local __var="${JSON_PREFIX}TYPE_${__cur}_${2//[^a-zA-Z0-9_]/_}"
+       eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
+}
+
+json_get_keys() {
+       local __dest="$1"
+       local _tbl_cur
+
+       json_get_var _tbl_cur "$2"
+       local __var="${JSON_PREFIX}KEYS_${_tbl_cur}"
+       eval "export -- \"$__dest=\${$__var}\"; [ -n \"\${$__var+x}\" ]"
+}
+
+json_get_values() {
+       local _v_dest="$1"
+       local _v_keys _v_val
+
+       unset "$_v_dest"
+       json_get_keys _v_keys "$2"
+       json_select "$2"
+       set -- $_v_keys
+       while [ "$#" -gt 0 ]; do
+               json_get_var _v_val "$1"
+               __jshn_raw_append "$_v_dest" "$_v_val"
+               shift
+       done
+       json_select ..
 }
 
 json_get_var() {
@@ -219,19 +258,23 @@ json_get_vars() {
 json_select() {
        local target="$1"
        local type
+       local cur
 
        [ -z "$1" ] && {
                _json_set_var JSON_CUR "JSON_VAR"
                return 0
        }
        [[ "$1" == ".." ]] && {
-               eval "JSON_CUR=\"\${UP_$JSON_CUR}\""
+               _json_get_var cur JSON_CUR
+               _json_get_var cur "UP_$cur"
+               _json_set_var JSON_CUR "$cur"
                return 0
        }
        json_get_type type "$target"
        case "$type" in
                object|array)
-                       _json_get_var JSON_CUR "$target"
+                       json_get_var cur "$target"
+                       _json_set_var JSON_CUR "$cur"
                ;;
                *)
                        echo "WARNING: Variable '$target' does not exist or is not an array/object"
@@ -239,3 +282,10 @@ json_select() {
                ;;
        esac
 }
+
+json_is_a() {
+       local type
+
+       json_get_type type "$1"
+       [ "$type" = "$2" ]
+}