-
Notifications
You must be signed in to change notification settings - Fork 1
/
resolve-node.sh
98 lines (80 loc) · 1.99 KB
/
resolve-node.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# in: integer or text
# out: node id or complaint
# without --unique flag, doesn't complain for multiple matches
# --validate -- check that each id or search key exists
# maybe a quiet flag too? to avoid 2>/dev/null?
ids=()
keys=()
unique=
validate=
while test $# -gt 0; do
case $1 in
--validate) validate=t
;;
--unique) unique=t
# note unique implies validate
;;
*)
# check for integer
if test $1 -eq $1 2>/dev/null; then
ids+=($1)
else
keys+=($1)
fi
;;
esac
shift
done
if test $unique; then
if test -z "$ids" -a -z "$keys"; then
echo "Didn't get any node identifiers in resolve-node.sh" >&2
exit
fi
if test "$ids" -a "$keys"; then
echo "Too many arguments given to resolve unique node! (resolve-node.sh)" >&2
exit
fi
if test "$ids"; then
# check if singular
if test ${#ids[@]} -gt 1; then
echo "Too many ids given" >&2
exit
fi
# check if exists!!
id=${ids[0]}
if test $(jq --arg id $id '.nodes[] | select(.id==$id)' <$file | jq -s 'length') -gt 0
then
echo $id
else
echo "Node id not found (resolve-node.sh)" >&2
exit
fi
else
matches=$(jq --arg key "$key" '.nodes[] | select(.text | contains($key))' <$file \
| jq -s 'length')
if test $matches -gt 1; then
echo "Ambiguous! try longer key (resolve-node.sh)" >&2
exit
elif test $matches -lt 1; then
echo "No matches! (resolve-node.sh)" >& 2
exit
fi
jq -r --arg key "$key" '.nodes[] | select(.text | contains($key)) | .id' <$file
fi
else
# not unique
resolved_ids=(${ids[@]})
for key in ${keys[@]}; do
resolved_ids+=($(jq -r --arg key "$key" '.nodes[] | select(.text | contains($key)) | .id' <$file))
done
if test $validate; then
for id in ${resolved_ids[@]}; do
if test $(jq --arg id $id '.nodes[] | select(.id==$id)' <$file | jq -s 'length')\
-ne 1; then
echo "IDs failed to validate" >&2
exit
fi
done
fi
echo ${resolved_ids[@]}
fi