#!/usr/bin/env bash set -euo pipefail command_check() { local MISSING=() for cmd in "$@"; do if ! command -v "$cmd" >/dev/null 2>&1; then MISSING+=("$cmd") fi done if [[ ${#MISSING[*]} -gt 0 ]]; then echo "Error: Missing required programs:" >&2 for cmd in "${MISSING[@]}"; do echo " - $cmd" >&2 done exit 1 fi } command_check curl jq if [[ ! -t 0 ]]; then QUERY="$(cat)" elif [[ $# -gt 0 ]]; then QUERY="$*" else printf "Create a map link for a location.\n" printf "Address? " read -r QUERY fi ENCODED_QUERY="${QUERY// /%20}" LOCATION_JSON="$(curl -s "https://nominatim.openstreetmap.org/search?q=$ENCODED_QUERY&limit=2&format=json")" if ! jq empty <<<"$LOCATION_JSON" 2>/dev/null; then echo "Error: Something wrong, invalid JSON for location query." >&2 exit 1 fi coordinate() { local COOR="$1" local VALUE VALUE="$(jq -r ".[0].$COOR" <<<"$LOCATION_JSON")" if [[ "$VALUE" =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then echo "$VALUE" else echo "Error: Not a number" >&2 echo "Usage: $0
" >&2 echo "Query was: $QUERY" >&2 echo "Encoded query was: $ENCODED_QUERY" >&2 echo "Location JSON was: $LOCATION_JSON" >&2 exit 1 fi } LAT="$(coordinate lat)" LON="$(coordinate lon)" echo "https://www.openstreetmap.org/?mlat=$LAT&mlon=$LON#map=16/$LAT/$LON"