]> git.plutz.net Git - cgilite/commitdiff
more consistent db2/json structure and jpath selector
authorPaul Hänsch <paul@plutz.net>
Sun, 25 Feb 2024 18:28:04 +0000 (19:28 +0100)
committerPaul Hänsch <paul@plutz.net>
Sun, 25 Feb 2024 18:28:04 +0000 (19:28 +0100)
json.sh

diff --git a/json.sh b/json.sh
index 43026bed6bae6a5f9197b61cb2d75f2fd13eb278..ba1539adf7fb47b87013f7f0869e9aeee7fc2cac 100755 (executable)
--- a/json.sh
+++ b/json.sh
@@ -1,11 +1,11 @@
 #!/bin/sh
 
-[ -n "$include_json" ] && return 0
-include_json="$0"
+[ -n "$include_json" ] && return 0
+include_json="$0"
 
 . "${_EXEC:-.}/cgilite/db23.sh"
 
-debug(){ [ $# -gt 0 ] && printf '%s\n' "$@" >&2 || tee -a /dev/stderr; }
+debug(){ [ $# -gt 0 ] && printf '%s\n' "$@" >&2 || tee -a /dev/stderr; }
 
 json_except() {
   printf '%s\n' "$@" >&2;
@@ -91,57 +91,7 @@ json_number() {
     return 1
   fi
 
-  printf '%s   %s\n' "num:${number%.000000}" "$json_document"
-}
-
-json_value() {
-  local value json_document="$json_document"
-  json_type=""
-
-  json_space
-  case $json_document in
-    \"*)
-      value="$(json_string)" || return 1
-      json_document="${value#* }"
-      value="str:${value%%     *}"
-      json_type=string
-      ;;
-    [+-.0-9]*)
-      value="$(json_number)" || return 1
-      json_document="${value#* }"
-      value="${value%% *}"
-      json_type=number
-      ;;
-    "{"*)
-      value="$(json_object)" || return 1
-      json_document="${value#* }"
-      value="obj:${value%%     *}"
-      json_type=object
-      ;;
-    "["*)
-      value="$(json_array)" || return 1
-      json_document="${value#* }"
-      value="arr:${value%%     *}"
-      json_type=array
-      ;;
-    null*)
-      json_document="${json_document#null}"
-      value="null"
-      json_type=null
-      ;;
-    true*)
-      json_document="${json_document#true}"
-      value="true"
-      json_type=boolean
-      ;;
-    false*)
-      json_document="${json_document#false}"
-      value="false"
-      json_type=boolean
-      ;;
-  esac
-
-  printf "%s   %s\n" "$value" "$json_document"
+  printf '%s   %s\n' "${number%.000000}" "$json_document"
 }
 
 json_array() {
@@ -239,14 +189,64 @@ json_object() {
   printf "%s   %s\n" "$(STRING "$struct")" "$json_document"
 }
 
+json_value() {
+  local value json_document="$json_document"
+  json_type=""
+
+  json_space
+  case $json_document in
+    \"*)
+      value="$(json_string)" || return 1
+      json_document="${value#* }"
+      value="str:${value%%     *}"
+      json_type=string
+      ;;
+    [+-.0-9]*)
+      value="$(json_number)" || return 1
+      json_document="${value#* }"
+      value="num:${value%%     *}"
+      json_type=number
+      ;;
+    "{"*)
+      value="$(json_object)" || return 1
+      json_document="${value#* }"
+      value="obj:${value%%     *}"
+      json_type=object
+      ;;
+    "["*)
+      value="$(json_array)" || return 1
+      json_document="${value#* }"
+      value="arr:${value%%     *}"
+      json_type=array
+      ;;
+    null*)
+      json_document="${json_document#null}"
+      value="null"
+      json_type=null
+      ;;
+    true*)
+      json_document="${json_document#true}"
+      value="true"
+      json_type=boolean
+      ;;
+    false*)
+      json_document="${json_document#false}"
+      value="false"
+      json_type=boolean
+      ;;
+  esac
+
+  printf "%s   %s\n" "$value" "$json_document"
+}
+
 json_load() {
-  local json_document="$1"
+  local json_document="$1" json
 
-  json_value
+  json_value |UNSTRING
 }
 
 json_get() {
-  local json="$1" jpath="${2#.}" id idx
+  local json="$1" jpath="${2#.}" key idx
   json_type=''
 
   case $json in
@@ -258,11 +258,10 @@ json_get() {
            json_type="boolean";;
     null)  json_type="null";;
   esac
-  json="${json#???:}"
 
   case $jpath in
     "")
-      printf %s\\n "$json"
+      printf %s\\n "${json#???:}"
       return 0
       ;;
     "["[0-9]*"]"*)
@@ -270,28 +269,32 @@ json_get() {
       jpath="${jpath#"["*"]"}"
       ;;
     "['"*"']"*)
-      id="${jpath%%"']"*}" id="${id#"['"}"
+      key="${jpath%%"']"*}" key="${key#"['"}"
       jpath="${jpath#"['"*"']"}"
       ;;
-    *) id="${jpath%%[".["]*}"
-      jpath="${jpath#"$id"}"
+    "$"*)
+      jpath="${jpath#?}"
+      ;;
+    *) key="${jpath%%[".["]*}"
+      jpath="${jpath#"$key"}"
       ;;
   esac
 
-  if   [  "$id" -a "$json_type" = object ]; then
-    # if ! json="$(DB2 "$(UNSTRING "$json")" get "$id")"; then
-    if ! json="$(DB2 "$json" get "$id")"; then
-      debug "No key: \"$id\""
+  if   [ "$key" -a "$json_type" = object ]; then
+    if ! json="$(DB2 "${json#obj:}" get "$key")"; then
+      debug "Key not found: \"$key\""
       return 1
     fi
   elif [ "$idx" -a "$json_type" = array ]; then
-    if ! json="$(DB2 "$(UNSTRING "$json")" get @ "$(( idx + 1 ))")"; then
-    # if ! json="$(DB2 "$json" get @ "$(( idx + 1 ))")"; then
-      debug "No array index: \"$idx\""
+    if ! json="$(DB2 "${json#arr:}" get @ "$(( idx + 1 ))")"; then
+      debug "Array index not found: \"$idx\""
       return 1
     fi
-  else
-    debug "Value type missmatch"
+  elif [ "$key" ]; then
+    debug "Cannot select key (\"$key\") from value of type \"$json_type\""
+    return 1
+  elif [ "$idx" ]; then
+    debug "Cannot select index ($idx) from value of type \"$json_type\""
     return 1
   fi
   json_get "$json" "$jpath"