#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# ── Config ──────────────────────────────────────────────────────────────────
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly SCRIPT_NAME="$(basename "$0")"
# ── Helpers ──────────────────────────────────────────────────────────────────
log() { echo "[$(date +%T)] $*"; }
warn() { echo "[$(date +%T)] WARN: $*" >&2; }
die() { echo "[$(date +%T)] ERROR: $*" >&2; exit 1; }
require() {
for cmd in "$@"; do
command -v "$cmd" >/dev/null 2>&1 || die "Required command not found: $cmd"
done
}
# ── Usage ────────────────────────────────────────────────────────────────────
usage() {
cat <<EOF
Usage: $SCRIPT_NAME [OPTIONS] <arg>
Options:
-h, --help Show this help
-v, --verbose Verbose output
-n, --dry-run Show what would happen, don't do it
EOF
exit 0
}
# ── Parse args ───────────────────────────────────────────────────────────────
VERBOSE=0
DRY_RUN=0
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help) usage ;;
-v|--verbose) VERBOSE=1; shift ;;
-n|--dry-run) DRY_RUN=1; shift ;;
--) shift; break ;;
-*) die "Unknown option: $1" ;;
*) break ;;
esac
done
# ── Main ─────────────────────────────────────────────────────────────────────
require curl jq
log "Starting $SCRIPT_NAME"
[[ $VERBOSE -eq 1 ]] && log "Verbose mode ON"
[[ $DRY_RUN -eq 1 ]] && warn "Dry-run mode — no changes will be made"