diff --git a/additions/camoucfg/MaskConfig.hpp b/additions/camoucfg/MaskConfig.hpp index 76fc407..caf80fc 100644 --- a/additions/camoucfg/MaskConfig.hpp +++ b/additions/camoucfg/MaskConfig.hpp @@ -44,10 +44,14 @@ inline std::optional get_env_utf8(const std::string& name) { } inline const nlohmann::json& GetJson() { - static const nlohmann::json jsonConfig = []() { - std::string jsonString; - int index = 1; + static std::once_flag initFlag; + static nlohmann::json jsonConfig; + std::call_once(initFlag, []() { + std::string jsonString; + + // First try the chunked environment variables + int index = 1; while (true) { std::string envName = "CAMOU_CONFIG_" + std::to_string(index); auto partialConfig = get_env_utf8(envName); @@ -57,23 +61,36 @@ inline const nlohmann::json& GetJson() { index++; } + // If no chunked variables found, try the original CAMOU_CONFIG if (jsonString.empty()) { - // Check for the original CAMOU_CONFIG as fallback auto originalConfig = get_env_utf8("CAMOU_CONFIG"); - if (originalConfig) jsonString = *originalConfig; + if (originalConfig) { + jsonString = *originalConfig; + } } - if (jsonString.empty()) return nlohmann::json{}; - - // Validate - if (!nlohmann::json::accept(jsonString)) { - printf_stderr("ERROR: Invalid JSON passed to CAMOU_CONFIG!\n"); - return nlohmann::json{}; + // If still empty, return an empty JSON object + if (jsonString.empty()) { + jsonConfig = nlohmann::json{}; + return; } - nlohmann::json result = nlohmann::json::parse(jsonString); - return result; - }(); + // Validate and parse the JSON + try { + if (!nlohmann::json::accept(jsonString)) { + printf_stderr("ERROR: Invalid JSON passed to CAMOU_CONFIG!\n"); + jsonConfig = nlohmann::json{}; + return; + } + + jsonConfig = nlohmann::json::parse(jsonString); + } catch (const nlohmann::json::exception& e) { + printf_stderr("ERROR: JSON parsing failed: %s\n", e.what()); + jsonConfig = nlohmann::json{}; + } + }); + + // Return the cached JSON object return jsonConfig; }