add jshn (JSON SHell Notation), a small utility and shell library for parsing and...
[openwrt.git] / package / jshn / files / jshn.sh
diff --git a/package/jshn/files/jshn.sh b/package/jshn/files/jshn.sh
new file mode 100644 (file)
index 0000000..2dddfe8
--- /dev/null
@@ -0,0 +1,109 @@
+[ -z "$N" ] && . /etc/functions.sh
+
+# functions for parsing and generating json
+
+json_init() {
+       [ -n "$JSON_UNSET" ] && eval "unset $JSON_UNSET"
+       export -- JSON_SEQ=0 JSON_STACK= JSON_CUR="JSON_VAR" JSON_UNSET=
+}
+
+json_add_generic() {
+       local type="$1"
+       local var="$2"
+       local val="$3"
+       local cur="${4:-$JSON_CUR}"
+
+       export ${NO_EXPORT:+-n} -- "${cur}_$var=$val"
+       export ${NO_EXPORT:+-n} -- "TYPE_${cur}_$var=$type"
+       append JSON_UNSET "${cur}_$var TYPE_${cur}_$var"
+       append "KEYS_${cur}" "$var"
+}
+
+json_add_table() {
+       JSON_SEQ=$(($JSON_SEQ + 1))
+       append JSON_STACK "$JSON_CUR"
+       local table="JSON_TABLE$JSON_SEQ"
+       export ${NO_EXPORT:+-n} -- "UP_$table=$JSON_CUR"
+       JSON_CUR="$table"
+}
+
+json_add_object() {
+       local cur="$JSON_CUR"
+       json_add_table
+       json_add_generic object "$1" "$JSON_CUR" "$cur"
+}
+
+json_close_object() {
+       local oldstack="$JSON_STACK"
+       export "KEYS_${JSON_CUR}"
+       JSON_CUR="${JSON_STACK##* }"
+       JSON_STACK="${JSON_STACK% *}"
+       [[ "$oldstack" == "$JSON_STACK" ]] && JSON_STACK=
+}
+
+json_add_array() {
+       local cur="$JSON_CUR"
+       json_add_table
+       json_add_generic array "$1" "$JSON_CUR" "$cur"
+}
+
+json_close_array() {
+       json_close_object
+}
+
+json_add_string() {
+       json_add_generic string "$1" "$2"
+}
+
+json_add_int() {
+       json_add_generic int "$1" "$2"
+}
+
+json_add_boolean() {
+       json_add_generic boolean "$1" "$2"
+}
+
+# functions read access to json variables
+
+json_load() {
+       eval `jshn -r "$1"`
+}
+
+json_dump() {
+       jshn -w
+}
+
+json_get_type() {
+       local dest="$1"
+       local var="$2"
+       eval "export ${NO_EXPORT:+-n} -- \"$dest=\${TYPE_${JSON_CUR}_$var}\""
+}
+
+json_get_var() {
+       local dest="$1"
+       local var="$2"
+       eval "export ${NO_EXPORT:+-n} -- \"$dest=\${${JSON_CUR}_$var}\""
+}
+
+json_select() {
+       local target="$1"
+       local type
+
+       [ -z "$1" ] && {
+               JSON_CUR="JSON_VAR"
+               return
+       }
+       [[ "$1" == ".." ]] && {
+               eval "JSON_CUR=\"\${UP_$JSON_CUR}\""
+               return;
+       }
+       json_get_type type "$target"
+       case "$type" in
+               object|array)
+                       json_get_var JSON_CUR "$target"
+               ;;
+               *)
+                       echo "WARNING: Variable '$target' does not exist or is not an array/object"
+               ;;
+       esac
+}
This page took 0.028105 seconds and 4 git commands to generate.