# 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}")