#!/usr/bin/env bash set -euo pipefail # check_hardcoded_service_ids.sh — запрет сервис-специфичных хардкодов по числовому ID. # # Ищет: # 1) сравнения вида svc.ID == N / ServiceID == N / spec.ServiceID == N (N > 0) # 2) литеральные ref-service id в вызовах резолва: # ResolveRefSvcParamValue(ctx, 19, ...) / ResolveRefSvcParamDisplayName(ctx, 22, ...) # # Область: TOOLS/** и provider/internal/** (кроме сгенерированного resources_gen/**). # Исключения должны жить в именованных реестрах/константах (данные), а не как магические числа. # - TOOLS/docs-generator/internal/writers/writers.go (serviceSpecificDocExamples) # - provider/internal/resources_core/*.go (именованные svcID* константы) # # Выход: 0 — хардкодов нет; 1 — найдены. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}" SCAN_DIRS=("$ROOT_DIR/TOOLS" "$ROOT_DIR/provider/internal") matches="" for dir in "${SCAN_DIRS[@]}"; do [[ -d "$dir" ]] || continue # Сгенерированный код не сканируем — он не редактируется руками (см. ARCHITECTURE.md). found="$(grep -rnE \ -e '\.(ServiceID|ID)[[:space:]]*==[[:space:]]*[1-9][0-9]*' \ -e '(ResolveRefSvcParamValue|ResolveRefSvcParamDisplayName)\([^,]+, *[1-9][0-9]*' \ "$dir" --include='*.go' --exclude-dir=resources_gen || true)" if [[ -n "$found" ]]; then matches+="$found"$'\n' fi done if [[ -n "$matches" ]]; then echo "HARDCODED SERVICE ID FOUND (service-specific logic must live in a named registry):" >&2 printf '%s' "$matches" >&2 echo "" >&2 echo "Вынеси исключение в именованный реестр/константу:" >&2 echo " - TOOLS/docs-generator/internal/writers/writers.go (serviceSpecificDocExamples)" >&2 echo " - provider/internal/resources_core/*.go (именованные svcID* константы)" >&2 echo "См. TOOLS/ARCHITECTURE.md, раздел «Exception Registry»." >&2 exit 1 fi echo "OK: no hardcoded service IDs in TOOLS/ and provider/internal/."