4001929053808f4eee766f26fd2309604981e5a1
[jackhill/mal.git] / jq / run
1 #!/bin/bash
2
3 # let's do some sorcery to bestow IO upon jq
4 runjq() {
5 pipe_name=$(mktemp)
6 rm -f $pipe_name $ipipe_name
7 mkfifo $pipe_name || true
8 xstdout=$(readlink /proc/self/fd/1)
9 stdin=$(readlink /proc/self/fd/0)
10 trap "rm -f $pipe_name" EXIT SIGINT SIGHUP
11 (
12 while [[ -e $pipe_name ]]; do
13 timeout 1 cat $pipe_name
14 done&
15 ) | jq -nrRM -f "$(dirname "$0")/${STEP:-stepA_mal}.jq" --args "${@}" |&\
16 tee \
17 >(jq -Rr 'try fromjson[1]|if type == "string" then . else empty end') \
18 >(while read -r line; do
19 command=$(echo $line | jq -c 'try if .[1] | has("command") then .[1].command else empty end' 2>/dev/null)
20 if [[ $command ]]; then
21 # echo ">>> " $command
22 cmd=$(echo "$command" | jq -rMc 'try .cmd catch "ignore"')
23 case "$cmd" in
24 readline)
25 data=$(jq -nR input < $stdin)
26 size=${#data}
27 # echo "read $size bytes '$data'"
28 echo "$data" | pv -q -B $size > $pipe_name
29 ;;
30 read)
31 filename=$(echo "$command" | jq -Mrc '.args[0]')
32 tmp=$(mktemp)
33 # echo "Read $filename into $tmp"
34 jq -rRnc --rawfile content "$filename" '$content|tojson' > $tmp
35 # echo "dump $tmp to pipe"
36 size=$(du -k $tmp)
37 cat $tmp | pv -q -B $size > $pipe_name #>/dev/null 2>&1
38 rm $tmp
39 ;;
40 fwrite)
41 tmp=$(mktemp)
42 echo "$command" > $tmp
43 filename=$(cat $tmp | jq -Mrc ".args[0]|fromjson")
44 content=$(cat $tmp | jq -Mrc ".args[1]|fromjson")
45 app=$(cat $tmp | jq -Mrc ".args[2]|fromjson")
46 echo "'$app': Writing stuff to $filename"
47 if [[ $res == false ]]; then
48 echo "$content" > "$filename"
49 else
50 echo "$content" >> "$filename"
51 fi
52 ;;
53 *)
54 echo $cmd
55 ;;
56 esac
57 fi
58 done) > /dev/null
59 rm -f $pipe_name
60 }
61 my_pid=$$
62 trap 'kill -INT $my_pid' EXIT SIGINT
63 runjq "${@}"