BareGit
# Generate byte arrays without depending on external embedding tools.
if(NOT DEFINED OUTPUT OR NOT DEFINED WEB_ROOT OR NOT DEFINED STATIC_FILES)
    message(FATAL_ERROR "Asset embedding needs OUTPUT, WEB_ROOT, and STATIC_FILES")
endif()

set(EMBEDDED_SOURCE
    "#include \"embedded_assets.hpp\"\n\n"
    "namespace nethack_mcp\n{\n\nnamespace\n{\n")
set(ASSET_ENTRIES "")
set(ASSET_INDEX 0)
foreach(ASSET IN LISTS STATIC_FILES)
    file(READ "${ASSET}" ASSET_HEX HEX)
    string(LENGTH "${ASSET_HEX}" ASSET_SIZE)
    math(EXPR ASSET_SIZE "${ASSET_SIZE} / 2")
    string(REGEX REPLACE "([0-9A-Fa-f][0-9A-Fa-f])" "0x\\1,"
        ASSET_BYTES "${ASSET_HEX}")
    string(APPEND EMBEDDED_SOURCE
        "const unsigned char ASSET_${ASSET_INDEX}[] = "
        "{${ASSET_BYTES}0};\n")
    file(RELATIVE_PATH ASSET_NAME "${WEB_ROOT}" "${ASSET}")
    get_filename_component(ASSET_EXTENSION "${ASSET}" LAST_EXT)
    if(ASSET_EXTENSION STREQUAL ".html")
        set(ASSET_TYPE "text/html; charset=utf-8")
    elseif(ASSET_EXTENSION STREQUAL ".md")
        set(ASSET_TYPE "text/markdown; charset=utf-8")
    elseif(ASSET_EXTENSION STREQUAL ".css")
        set(ASSET_TYPE "text/css; charset=utf-8")
    elseif(ASSET_EXTENSION STREQUAL ".js")
        set(ASSET_TYPE "application/javascript; charset=utf-8")
    elseif(ASSET_EXTENSION STREQUAL ".ttf")
        set(ASSET_TYPE "font/ttf")
    else()
        set(ASSET_TYPE "application/octet-stream")
    endif()
    if(ASSET_NAME STREQUAL "index.html")
        set(ASSET_PATH "/")
    elseif(ASSET_NAME STREQUAL "kreative_square.ttf")
        set(ASSET_PATH "/viewer-font.ttf")
    else()
        set(ASSET_PATH "/${ASSET_NAME}")
    endif()
    string(APPEND ASSET_ENTRIES
        "    {\"${ASSET_PATH}\", \"${ASSET_TYPE}\", "
        "{reinterpret_cast<const char*>(ASSET_${ASSET_INDEX}), "
        "${ASSET_SIZE}}},\n")
    math(EXPR ASSET_INDEX "${ASSET_INDEX} + 1")
endforeach()
string(APPEND EMBEDDED_SOURCE
    "const EmbeddedAsset ASSETS[] = {\n${ASSET_ENTRIES}};\n}\n\n"
    "std::span<const EmbeddedAsset> embeddedAssets()\n{\n"
    "    return ASSETS;\n}\n\n}\n")
get_filename_component(OUTPUT_DIRECTORY "${OUTPUT}" DIRECTORY)
file(MAKE_DIRECTORY "${OUTPUT_DIRECTORY}")
file(WRITE "${OUTPUT}" "${EMBEDDED_SOURCE}")