@@ -198,51 +198,69 @@ for p in "${PROVIDERS[@]}"; do
198198 i=$(( i + 1 ))
199199done
200200
201+ append_merged_entry () {
202+ local entry=" $1 "
203+ [[ -z " $entry " ]] && return
204+ if (( first )) ; then
205+ merged+=" $entry "
206+ first=0
207+ else
208+ merged+=" ,$entry "
209+ fi
210+ }
211+
201212merged=" ["
202213first=1
203214for p in " ${PROVIDERS[@]} " ; do
204215 body=" $( cat " $tmpdir /$p .json" ) "
205216 # CLI returns a JSON array; unwrap and append elements.
206- if [[ -z " $body " ]] || ! echo " $body " | jq -e ' type == "array"' > /dev/null 2>&1 ; then
217+ if [[ -z " $body " ]]; then
218+ continue
219+ fi
220+ if ! echo " $body " | jq -e ' type == "array"' > /dev/null 2>&1 ; then
221+ append_merged_entry " $( jq -cn \
222+ --arg provider " $p " \
223+ --arg message " invalid JSON from provider" \
224+ ' {provider: $provider, error: {message: $message}}' ) "
207225 continue
208226 fi
209227 inner=" $( echo " $body " | jq -c ' .[]' ) "
210228 while IFS= read -r entry; do
211- [[ -z " $entry " ]] && continue
212- if (( first )) ; then
213- merged+=" $entry "
214- first=0
215- else
216- merged+=" ,$entry "
217- fi
229+ append_merged_entry " $entry "
218230 done <<< " $inner"
219231done
220232merged+=" ]"
221233
234+ last_good_json=" "
235+ if [[ -f " $LAST_GOOD " ]]; then
236+ last_good_json=" $( jq -c ' select(type == "array")' " $LAST_GOOD " 2> /dev/null || true) "
237+ fi
238+
222239# Persist fresh successful provider snapshots without dropping older successful
223240# entries for providers that failed this refresh.
224241if [[ " $merged " != " []" ]] && echo " $merged " | jq -e ' any(.error | not)' > /dev/null 2>&1 ; then
225- if [[ -f " $LAST_GOOD " ]]; then
226- merged_for_cache=" $( jq -c --argjson prev " $( cat " $LAST_GOOD " ) " '
242+ if [[ -n " $last_good_json " ]]; then
243+ merged_for_cache=" $( jq -c --argjson prev " $last_good_json " '
227244 ([$prev[]? | select((.error | not) and (.stale != true))
228245 | {key: .provider, value: .}] | from_entries) as $ok_prev
229246 | ([.[]? | select(.error | not)
230- | {key: .provider, value: (del(.stale))}] | from_entries) as $ok_fresh
247+ | {key: .provider, value: (del(.stale))}] | from_entries) as $ok_fresh
231248 | ($ok_prev + $ok_fresh) | [.[]]
232249 ' <<< " $merged" ) "
233- echo " $merged_for_cache " > " $LAST_GOOD "
250+ [[ -n " $merged_for_cache " ]] && echo " $merged_for_cache " > " $LAST_GOOD "
234251 else
235252 echo " $merged " | jq -c ' map(select(.error | not) | del(.stale))' > " $LAST_GOOD "
236253 fi
254+ last_good_json=" $( jq -c ' select(type == "array")' " $LAST_GOOD " 2> /dev/null || true) "
237255fi
238256
239257# Fill in errored or missing providers with the last successful snapshot for
240- # display (marks them stale). Missing happens when a provider returns
241- # empty/invalid output instead of a JSON array.
242- if [[ -f " $LAST_GOOD " ]]; then
258+ # display (marks them stale). Missing happens when a provider returns empty
259+ # output instead of a JSON array.
260+ if [[ -n " $last_good_json " ]]; then
243261 providers_json=" $( printf ' %s\n' " ${PROVIDERS[@]} " | jq -R . | jq -s .) "
244262 merged=" $( jq -c \
245- --argjson prev " $( cat " $LAST_GOOD " ) " \
263+ --argjson prev " $last_good_json " \
246264 --argjson requested " $providers_json " '
247265 ([$prev[]? | select(.error | not) | {key: .provider, value: .}] | from_entries) as $ok_prev
248266 | (map(.provider) | unique) as $seen
0 commit comments