{{breadcrumbs}}
← BACK TO HUB
HUB / lib_bejson_validator.sh

lib_bejson_validator.sh

Runtime
Bash
Category
Bash
Path
/storage/emulated/0/Projects/Management/Libraries/sh/lib_bejson_validator.sh
FILE // lib_bejson_validator.sh
#!/bin/bash
# # Library:     lib_bejson_validator.sh
# MFDB Version: 1.3.1
# Format_Creator: Elton Boehnen
# Status:      OFFICIAL - v1.3.1
# Date:        2026-05-06

#===============================================================================
# Library:     lib_bejson_validator.sh
# Jurisdiction: ["BASH", "CORE_COMMAND"]
# Status:      OFFICIAL — Core-Command/Lib (v1.2)
# Author:      Elton Boehnen
# Version:     3.1.0 (OFFICIAL)
# Date:        2026-04-16
# Description: BEJSON validator — schema validation for 104, 104a, 104db.
#              MFDB validation functions are in lib_mfdb_validator.sh (decoupled).
#===============================================================================

set -o pipefail
set -o nounset

# Error codes
[[ -v E_VAL_NOT_JSON ]] || readonly E_VAL_NOT_JSON=1
[[ -v E_VAL_MISSING_KEY ]] || readonly E_VAL_MISSING_KEY=2
[[ -v E_VAL_BAD_FORMAT ]] || readonly E_VAL_BAD_FORMAT=3
[[ -v E_VAL_BAD_VERSION ]] || readonly E_VAL_BAD_VERSION=4
[[ -v E_VAL_BAD_CREATOR ]] || readonly E_VAL_BAD_CREATOR=5
[[ -v E_VAL_SCHEMA_MISMATCH ]] || readonly E_VAL_SCHEMA_MISMATCH=6
[[ -v E_VAL_INVALID_TYPE ]] || readonly E_VAL_INVALID_TYPE=7

#-------------------------------------------------------------------------------
# CORE VALIDATION
#-------------------------------------------------------------------------------

bejson_validator_check_dependencies() {
    if ! command -v jq >/dev/null 2>&1; then
        echo "ERROR: jq is required for BEJSON validation" >&2
        return 1
    fi
    local jq_ver=$(jq --version | sed 's/jq-//')
    # Simple check for jq >= 1.6
    if [[ "${jq_ver%%.*}" -lt 1 ]] || { [[ "${jq_ver%%.*}" -eq 1 ]] && [[ "${jq_ver#*.}" -lt 6 ]]; }; then
        echo "ERROR: jq >= 1.6 is required. Found: $jq_ver" >&2
        return 1
    fi
    return 0
}

bejson_validator_validate_file() {
    local file_path="$1"
    if [[ ! -f "$file_path" ]]; then
        echo "ERROR: File not found: $file_path" >&2
        return 1
    fi
    
    # 1. Basic JSON check
    if ! jq . "$file_path" >/dev/null 2>&1; then
        return $E_VAL_NOT_JSON
    fi

    # 2. Mandatory Keys check
    local keys=$(jq -r 'keys | join(",")' "$file_path")
    for k in Format Format_Version Format_Creator Records_Type Fields Values; do
        if [[ ! "$keys" =~ "$k" ]]; then
            return $E_VAL_MISSING_KEY
        fi
    done

    # 3. Format & Creator check
    local fmt=$(jq -r '.Format' "$file_path")
    local creator=$(jq -r '.Format_Creator' "$file_path")
    [[ "$fmt" != "BEJSON" ]] && return $E_VAL_BAD_FORMAT
    [[ "$creator" != "Elton Boehnen" ]] && return $E_VAL_BAD_CREATOR

    # 4. Records Length check
    local field_count=$(jq '.Fields | length' "$file_path")
    local bad_records=$(jq --argjson fc "$field_count" '.Values | map(select(length != $fc)) | length' "$file_path")
    if [[ "$bad_records" -gt 0 ]]; then
        return $E_VAL_SCHEMA_MISMATCH
    fi

    return 0
}

# Export functions
export -f bejson_validator_check_dependencies
export -f bejson_validator_validate_file