feat(package): hemar: antlr grammar, but still does not work

This commit is contained in:
2025-11-26 14:48:51 +00:00
parent 8a08272f68
commit 777d48bf3d
16 changed files with 282 additions and 7 deletions

View File

@@ -0,0 +1,70 @@
#!/bin/dash
plex_set() {
local structname key val regex base esc_key regex esc temp
structname=$1 key=$2 val=$3
# construct regex for ancestors
regex="^$key="
base=$key
while expr "$base" : '.*\.' >/dev/null; do
base=$(printf '%s\n' "$base" | sed 's/\.[^.]*$//')
esc=$(printf '%s\n' "$base" | sed 's/\./\\./g')
regex="$regex|^$esc="
done
# add descendants
esc_key="$(printf '%s\n' "$key" | sed 's/\./\\./g')"
regex="$regex|^${esc_key}\."
# remove old
# <plex>=$(printf '%s\n' "$<plex>" | grep -v -E "$regex")
temp="$(eval "printf '%s\\n' \"\$$structname\"" | grep -v -E "$regex")"
eval "$structname=\"\$temp\""
# add new
eval "$structname=\$(printf '%s\\n%s=%s\\n' \"\$$structname\" \"\$key\" \"\$val\")"
}
plex_child() {
local structname prefix
structname=$1 prefix=$2
eval printf '%s\\n' \"\$"$structname"\" \
| grep "^$prefix\." \
| sed "s|^$prefix\.||"
}
plex_val() {
local structname key
structname=$1 key=$2
eval printf '%s\n' \"\$"$structname"\" | grep "^$key=" | cut -d= -f2-
}
plex_fetch() {
local structname key
structname=$1 key=$2
if eval printf '%s\\n' \"\$"$structname"\" | grep -q "^$key="; then
eval printf '%s\\n' \"\$"$structname"\" | grep "^$key=" | cut -d= -f2-
else
eval printf '%s\\n' \"\$"$structname"\" | grep "^$key\." | sed "s|^$key\.||"
fi
}
plex_push() {
local structname prefix val max idx newidx kv
structname=${1:?}
prefix=${2:?}
val=${3:?}
# find max index
max=0
for kv in $(plex_fetch "$structname" "$prefix"); do
idx=${kv%%=*}
[ "$idx" -gt "$max" ] 2>/dev/null && max=$idx
done
newidx=$((max + 1))
plex_set "$structname" "$prefix.$newidx" "$val"
}

View File

@@ -0,0 +1,50 @@
#!/bin/dash
PLEX_TEMP="$(mktemp -d)"
#plex_set(name, key, value)
plex_set() {
local plexfile key val regex base esc_key esc
plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}" val="${3:?}"
find PLEX_
}
plex_child() {
local plexfile key
plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}"
grep "^$key\." "" | sed "s|^$key\.||"
}
plex_val() {
local plexfile key
plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}"
grep "^$key=" | cut -d= -f2- "$plexfile"
}
plex_fetch() {
local plexfile key temp
plexfile="${PLEX_TEMP:?}${1:?}" key="${2:?}"
if temp="$(grep "^$key=" | cut -d= -f2- "$plexfile")"; then
printf '%s' "$temp"
else
grep "^$key\." "" | sed "s|^$key\.||"
fi
}
plex_push() {
local plex prefix val max idx newidx kv
plex="${1:?}" prefix="${2:?}" val="${3:?}"
# find max index
max=0
for kv in $(plex_fetch "$plex" "$prefix"); do
idx=${kv%%=*}
[ "$idx" -gt "$max" ] 2>/dev/null && max=$idx
done
newidx=$((max + 1))
plex_set "$plex" "$prefix.$newidx" "$val"
}

View File

@@ -0,0 +1,40 @@
#!/bin/dash
PLEX_TEMP="$(mktemp -d)"
trap 'rm -rf $PLEX_TEMP' EXIT
#plex_set(name, key, value)
plex_set() {
local plexfile key val
plexfile="${PLEX_TEMP:?}/${1:?}.json" key="${2:?}" val="${3:?}"
touch "$plexfile"
yq -i ".$key = \"$val\"" "$plexfile"
}
#plex_child(name, key)
plex_child() {
plex_fetch "${1:?}" "${2:?}"
}
#plex_val(name, key)
plex_val() {
plex_fetch "${1:?}" "${2:?}"
}
#plex_val(name, key)
plex_fetch() {
local plexfile key
plexfile="${PLEX_TEMP:?}/${1:?}.json" key="${2:?}"
yq -r ".$key" "$plexfile"
}
#plex_push(name, prefix, val)
plex_push() {
local plexfile prefix val
plexfile="${PLEX_TEMP:?}/${1:?}.json" prefix="${2:?}" val="${3:?}"
yq -i ".$prefix += [\"$val\"]" "$plexfile"
}

View File

@@ -0,0 +1,21 @@
#!/bin/dash
init_plex() {
local backend
backend=${1:?}
case "$backend" in
env)
. ${WORKSPACE}/src/plex/backend/env_var.sh
;;
file)
. ${WORKSPACE}/src/plex/backend/file.sh
;;
yq-go)
. ${WORKSPACE}/src/plex/backend/yq-go.sh
;;
*)
exit 1
;;
esac
}