#!/usr/bin/env bash set -Eeuo pipefail JSON="${1:-}" [[ -z "${JSON}" ]] && { echo 'Missing input JSON file.' exit 2 } contains-element() { local e match="$1" shift for e; do [[ "$e" == "$match" ]] && return 0; done return 1 } fail-attr() { ATTRIBUTE="${1}" URL="${2}" red "Undefined '${ATTRIBUTE}' for ${URL}." >&2 exit 1 } LANGS=(en pt) assert-frontmatter() { F="${1}" LANG="$(echo "$F" | base64 --decode | jq -r .lang)" REF="$(echo "$F" | base64 --decode | jq -r .ref)" URL="$(echo "$F" | base64 --decode | jq -r .url)" [[ -z "${LANG}" ]] && fail-attr 'lang' "${URL}" [[ -z "${REF}" ]] && fail-attr 'ref' "${URL}" set +e contains-element "${LANG}" "${LANGS[@]}" [[ $? != 0 ]] && { red "Invalid lang '${LANG}' in ${URL}." >&2 exit 1 } set -e : } echo Linting posts... >&2 for post in $(jq -r '.posts[] | @base64' "${JSON}"); do assert-frontmatter "${post}" done echo Linting pages... >&2 IGNORED_PAGES=(/site.json /sitemap.xml) for page in $(jq -r '.pages[] | @base64' "${JSON}"); do URL="$(echo "$page" | base64 --decode | jq -r .url)" set +e contains-element "${URL}" "${IGNORED_PAGES[@]}" if [[ $? != 0 ]]; then set -e assert-frontmatter "${page}" fi set -e done echo Asserting unique refs... >&2 KNOWN_IDS=() for page in $(jq -r '.pages[] | @base64' "${JSON}"); do URL="$(echo "$page" | base64 --decode | jq -r .url)" set +e contains-element "${URL}" "${IGNORED_PAGES[@]}" if [[ $? != 0 ]]; then set -e LANG="$(echo "$page" | base64 --decode | jq -r .lang)" REF="$(echo "$page" | base64 --decode | jq -r .ref)" ID="${LANG}:${REF}" set +e contains-element "${ID}" "${KNOWN_IDS[@]}" [[ $? == 0 ]] && { red "Duplicated lang:ref match: '${ID}'." >&2 exit 1 } set -e KNOWN_IDS+=("${ID}") # printf '%s\n' "${KNOWN_IDS[@]}" fi set -e done echo Done. >&2