diff mbox series

[LEDE-DEV,libubox,v2] sh/jshn.sh: add json_for_each_item()

Message ID 20180208083645.14364-1-dedeckeh@gmail.com
State Accepted
Headers show
Series [LEDE-DEV,libubox,v2] sh/jshn.sh: add json_for_each_item() | expand

Commit Message

Hans Dedecker Feb. 8, 2018, 8:36 a.m. UTC
Function usefull to iterate through the different elements of an
array or object; the provided callback function is called for each
element which is passed the value, key and user provided arguments.
For field types different from array or object the callback is called
with the retrieved value.

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
---
v2 : Pass the key as well to the callback function

 sh/jshn.sh | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
diff mbox series

Patch

diff --git a/sh/jshn.sh b/sh/jshn.sh
index bf76edb..a7b9b0c 100644
--- a/sh/jshn.sh
+++ b/sh/jshn.sh
@@ -278,3 +278,28 @@  json_is_a() {
 	json_get_type type "$1"
 	[ "$type" = "$2" ]
 }
+
+json_for_each_item() {
+	[ "$#" -ge 2 ] || return 0
+	local function="$1"; shift
+	local target="$1"; shift
+	local type val
+
+	json_get_type type "$target"
+	case "$type" in
+		object|array)
+			local keys key
+			json_select "$target"
+			json_get_keys keys
+			for key in $keys; do
+				json_get_var val "$key"
+				eval "$function \"\$val\" \"\$key\" \"\$@\""
+			done
+			json_select ..
+		;;
+		*)
+			json_get_var val "$target"
+			eval "$function \"\$val\" \"\" \"\$@\""
+		;;
+	esac
+}