From patchwork Sun May 4 22:04:50 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philip Prindeville X-Patchwork-Id: 2080921 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=3WPoX/AQ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.openwrt.org (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=patchwork.ozlabs.org) Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:3::133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4ZrJd71m1Rz1yQ7 for ; Mon, 5 May 2025 08:05:47 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type:List-Help: Reply-To:List-Archive:List-Unsubscribe:List-Subscribe:From:List-Post:List-Id: Message-ID:MIME-Version:Date:Subject:To:Cc:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=0b6ZHj3Zb+trAk6fg9L2aMlwuJv4q/TWffZ4tfSrHTs=; b=3WPoX/AQ211Nd13y0/cAgZbghb qye/9lZKlZkQ5JU9yvE3ArvBomTf9+sjIe3eBLH2AQRbP6H/tutLKCFgIAwmVzWlYOVrUsJ9PM+io jDPCVib3QbcDqDnm+2B3yILxHENFXe4xK9uEXnIx8Wh5gn0wk4+XfZdrvC2ssaVNCsXhug+RMVm/Q Thlpfi8Da5NckztiDcWumUuWtJyb5HS9SxLKSpdcII5PX+lgUV5g6Y9JJliqdc76FG9YoJSaztLen UPiRl7Snbzx/RXqzKEjqj7/7dKxYmCQzvnZY/NJFVxTaWMd+4pmxMxMkY2ZnXa3R9mKFH9rbcO0W4 zkOi00Tg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux)) id 1uBhSA-000000061uH-0GBX; Sun, 04 May 2025 22:04:54 +0000 To: openwrt-devel@lists.openwrt.org Subject: [PATCH 1/1] jshn.sh: Add getters for the cursor and its parent Date: Sun, 4 May 2025 16:04:50 -0600 MIME-Version: 1.0 Message-ID: List-Id: OpenWrt Development List List-Post: X-Patchwork-Original-From: Philip Prindeville via openwrt-devel From: Philip Prindeville Precedence: list X-Mailman-Version: 2.1.34 X-BeenThere: openwrt-devel@lists.openwrt.org List-Subscribe: , List-Unsubscribe: , List-Archive: Reply-To: Philip Prindeville List-Help: Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org The sender domain has a DMARC Reject/Quarantine policy which disallows sending mailing list messages using the original "From" header. To mitigate this problem, the original message has been wrapped automatically by the mailing list software. From: Philip Prindeville When building JSON, the order in which it is synthesized might not match the order in which the source information is parsed. In those cases, it is useful to be able to save your place in an object or an array and come back to it later and fill it out. Signed-off-by: Philip Prindeville --- sh/jshn.sh | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/sh/jshn.sh b/sh/jshn.sh index 1d3055711820e5a21ea59cae49e7bf3f56b626d8..5599c85835d0c81c8d47a9dfd73f32e4db2a7c9b 100644 --- a/sh/jshn.sh +++ b/sh/jshn.sh @@ -197,6 +197,42 @@ json_add_fields() { done } +json_get_position() { + local __dest="$1" + eval "export -- \"$__dest=\${JSON_CUR}\"; [ -n \"\${JSON_CUR+x}\" ]" +} + +json_move_to() { + local cur="$1" + _json_set_var JSON_CUR "$cur" +} + +json_get_parent_position() { + local __dest="$1" cur parent + _json_get_var cur JSON_CUR + parent="U_$cur" + eval "export -- \"$__dest=\${$parent}\"; [ -n \"\${$parent+x}\" ]" +} + +json_get_root_position() { + local __dest="$1" cur="J_V" + eval "export -- \"$__dest=\${cur}\"; [ -n \"\${cur+x}\" ]" +} + +json_get_index() { + local __dest="$1" + local cur parent seq + _json_get_var cur JSON_CUR + _json_get_var parent "U_$cur" + if [ "${parent%%[0-9]*}" != "J_A" ]; then + [ -n "$_json_no_warning" ] || \ + echo "WARNING: Not inside an array" >&2 + return 1 + fi + seq="S_$parent" + eval "export -- \"$__dest=\${$seq}\"; [ -n \"\${$seq+x}\" ]" +} + # functions read access to json variables json_compact() {