mirror of
https://github.com/tradecatlabs/vibe-coding-cn.git
synced 2026-07-31 04:37:45 +00:00
66 lines
1.4 KiB
Bash
66 lines
1.4 KiB
Bash
#!/usr/bin/env bash
|
|
# check-jsonl: lightweight JSONL field gate without jq dependency.
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'EOF'
|
|
check-jsonl: validate JSONL-like lines contain required fields
|
|
|
|
Usage:
|
|
check-jsonl.sh FILE [--require-key KEY ...]
|
|
|
|
Defaults:
|
|
Requires no fixed keys unless --require-key is provided.
|
|
|
|
This is a lightweight gate: it checks non-empty lines look like JSON objects and
|
|
contain required top-level key names. It does not replace a full JSON parser.
|
|
EOF
|
|
}
|
|
|
|
die() {
|
|
printf 'error: %s\n' "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
file=""
|
|
required_keys=()
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--require-key)
|
|
required_keys+=("${2:-}")
|
|
shift 2
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
if [[ -z "$file" ]]; then
|
|
file="$1"
|
|
shift
|
|
else
|
|
die "unknown option: $1"
|
|
fi
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[[ -n "$file" ]] || die "missing FILE"
|
|
[[ -f "$file" ]] || die "file not found: $file"
|
|
|
|
line_no=0
|
|
checked=0
|
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
line_no=$((line_no + 1))
|
|
[[ -n "$line" ]] || continue
|
|
[[ "$line" =~ ^\{.*\}$ ]] || die "line $line_no is not a JSON object"
|
|
for key in "${required_keys[@]}"; do
|
|
[[ "$line" == *"\"$key\""* ]] || die "line $line_no missing key: $key"
|
|
done
|
|
checked=$((checked + 1))
|
|
done < "$file"
|
|
|
|
((checked > 0)) || die "no JSONL records found"
|
|
printf 'jsonl ok: %s records=%s\n' "$file" "$checked"
|