summaryrefslogtreecommitdiff
path: root/gron
diff options
context:
space:
mode:
Diffstat (limited to 'gron')
-rwxr-xr-xgron63
1 files changed, 63 insertions, 0 deletions
diff --git a/gron b/gron
new file mode 100755
index 0000000..0fd05d0
--- /dev/null
+++ b/gron
@@ -0,0 +1,63 @@
+#!/bin/bash
+set -e
+
+. "$(dirname -- "${BASH_SOURCE[0]}")/json.sh"
+
+stack=()
+
+print_lhs() {
+ printf 'json'
+ local x
+ for x in "${stack[@]}"; do
+ printf '[%s]' "$x"
+ done
+ printf '='
+}
+
+handle_token() {
+ local val=''
+ case "$1" in
+ object_beg)
+ val='{}'
+ stack+=('bogus')
+ ;;
+ object_end)
+ stack=("${stack[@]::${#stack[@]}-1}")
+ ;;
+ object_key)
+ stack[${#stack[@]}-1]="${2@Q}"
+ ;;
+ array_beg)
+ val='[]'
+ stack+=('0')
+ ;;
+ array_end)
+ stack=("${stack[@]::${#stack[@]}-1}")
+ ;;
+ number)
+ val="$2"
+ ;;
+ string)
+ val="${2@Q}"
+ ;;
+ null|true|false)
+ val="$1"
+ ;;
+ error)
+ printf >&2 "json error: $1\n" "${@:2}"
+ ;;
+ esac
+ if [[ -n "$val" ]]; then
+ printf 'json'
+ local x
+ for x in "${stack[@]}"; do
+ printf '[%s]' "$x"
+ done
+ printf '=%s;\n' "$val"
+ fi
+ if [[ ${#stack[@]} -gt 0 && ${stack[${#stack[@]}-1]} =~ ^[0-9]$ ]]; then
+ stack[${#stack[@]}-1]=$((${stack[${#stack[@]}-1]}+1))
+ fi
+}
+
+json_tokenize handle_token