#include "Core.h" #include "WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h" #include "WallpaperEngine/Core/UserSettings/CUserSettingFloat.h" #include "WallpaperEngine/Core/UserSettings/CUserSettingVector3.h" #include "WallpaperEngine/Logging/CLog.h" using namespace WallpaperEngine; using namespace WallpaperEngine::Core::UserSettings; glm::vec4 Core::aToVector4 (const char* str) { float x = strtof (str, const_cast (&str)); while (*str == ' ') str++; float y = strtof (str, const_cast (&str)); while (*str == ' ') str++; float z = strtof (str, const_cast (&str)); while (*str == ' ') str++; float w = strtof (str, const_cast (&str)); return {x, y, z, w}; } glm::vec3 Core::aToVector3 (const char* str) { float x = strtof (str, const_cast (&str)); while (*str == ' ') str++; float y = strtof (str, const_cast (&str)); while (*str == ' ') str++; float z = strtof (str, const_cast (&str)); return {x, y, z}; } glm::vec2 Core::aToVector2 (const char* str) { float x = strtof (str, const_cast (&str)); while (*str == ' ') str++; float y = strtof (str, const_cast (&str)); return {x, y}; } glm::ivec4 Core::aToVector4i (const char* str) { int x = strtol (str, const_cast (&str), 10); while (*str == ' ') str++; int y = strtol (str, const_cast (&str), 10); while (*str == ' ') str++; int z = strtol (str, const_cast (&str), 10); while (*str == ' ') str++; int w = strtol (str, const_cast (&str), 10); return {x, y, z, w}; } glm::ivec3 Core::aToVector3i (const char* str) { int x = strtol (str, const_cast (&str), 10); while (*str == ' ') str++; int y = strtol (str, const_cast (&str), 10); while (*str == ' ') str++; int z = strtol (str, const_cast (&str), 10); return {x, y, z}; } glm::ivec2 Core::aToVector2i (const char* str) { int x = strtol (str, const_cast (&str), 10); while (*str == ' ') str++; int y = strtol (str, const_cast (&str), 10); return {x, y}; } glm::vec4 Core::aToVector4 (const std::string& str) { return Core::aToVector4 (str.c_str ()); } glm::vec3 Core::aToVector3 (const std::string& str) { return Core::aToVector3 (str.c_str ()); } glm::vec2 Core::aToVector2 (const std::string& str) { return Core::aToVector2 (str.c_str ()); } glm::ivec4 Core::aToVector4i (const std::string& str) { return Core::aToVector4i (str.c_str ()); } glm::ivec3 Core::aToVector3i (const std::string& str) { return Core::aToVector3i (str.c_str ()); } glm::ivec2 Core::aToVector2i (const std::string& str) { return Core::aToVector2i (str.c_str ()); } glm::vec3 Core::aToColorf (const char* str) { float r = strtof (str, const_cast (&str)); while (*str == ' ') str++; float g = strtof (str, const_cast (&str)); while (*str == ' ') str++; float b = strtof (str, const_cast (&str)); return {r, g, b}; } glm::vec3 Core::aToColorf (const std::string& str) { return aToColorf (str.c_str ()); } glm::ivec3 Core::aToColori (const char* str) { auto r = static_cast (strtol (str, const_cast (&str), 10)); while (*str == ' ') str++; auto g = static_cast (strtol (str, const_cast (&str), 10)); while (*str == ' ') str++; auto b = static_cast (strtol (str, const_cast (&str), 10)); return {r, g, b}; } glm::ivec3 Core::aToColori (const std::string& str) { return aToColori (str.c_str ()); } template bool typeCheck (const nlohmann::json::const_iterator& value) { if (value->type () == nlohmann::detail::value_t::null) { return false; } // type checks if constexpr ((std::is_same_v || std::is_same_v) ) { if (value->type () != nlohmann::detail::value_t::number_float && value->type () != nlohmann::detail::value_t::number_integer && value->type () != nlohmann::detail::value_t::number_unsigned) { return false; } } else if constexpr (std::is_same_v) { if (value->type () != nlohmann::detail::value_t::string) { return false; } } else if constexpr (std::is_same_v) { if (value->type () != nlohmann::detail::value_t::boolean) { return false; } } else if constexpr ( std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v || std::is_same_v) { if (value->type () != nlohmann::detail::value_t::string) { return false; } } return true; } template const T Core::jsonFindRequired ( const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg ) { const auto iterator = jsonFindRequired (data, key, notFoundMsg); // vector types need of special handling if constexpr (std::is_same_v) { // std::strings are special, type checking doesn't need to happen, we just want the string representation // of whatever is in there if (iterator->is_number_integer ()) { return std::to_string (iterator->get ()); } else if (iterator->is_number_float ()) { return std::to_string (iterator->get ()); } else if (iterator->is_boolean()) { return std::to_string (iterator->get ()); } else if (iterator->is_null ()) { return "null"; } else if (iterator->is_string ()) { return *iterator; } } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector4 (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector3 (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector2 (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector4i (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector3i (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector2i (*iterator); } else if (typeCheck (iterator)) { return *iterator; } sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), ": ", notFoundMsg); } template const bool Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const std::string Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const int16_t Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const uint16_t Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const int32_t Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const uint32_t Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const int64_t Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const uint64_t Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const float Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const double Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const glm::vec4 Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const glm::vec3 Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const glm::vec2 Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const glm::ivec4 Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const glm::ivec3 Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const glm::ivec2 Core::jsonFindRequired (const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg); template const T Core::jsonFindRequired ( const nlohmann::json& data, const char* key, const char* notFoundMsg ) { const auto iterator = jsonFindRequired (data, key, notFoundMsg); // vector types need of special handling if constexpr (std::is_same_v) { // std::strings are special, type checking doesn't need to happen, we just want the string representation // of whatever is in there if (iterator->is_number_integer ()) { return std::to_string (iterator->get ()); } else if (iterator->is_number_float ()) { return std::to_string (iterator->get ()); } else if (iterator->is_boolean()) { return std::to_string (iterator->get ()); } else if (iterator->is_null ()) { return "null"; } else if (iterator->is_string ()) { return *iterator; } } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector4 (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector3 (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector2 (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector4i (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector3i (*iterator); } else if constexpr (std::is_same_v) { if (!typeCheck (iterator)) { sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), " expected vector-like-string", ": ", notFoundMsg); } return aToVector2i (*iterator); } else if (typeCheck (iterator)) { return *iterator; } sLog.exception ("key value doesn't match expected type. Got ", iterator->type_name(), ": ", notFoundMsg); } template const bool Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const std::string Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const int16_t Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const uint16_t Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const int32_t Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const uint32_t Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const int64_t Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const uint64_t Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const float Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const double Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const glm::vec4 Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const glm::vec3 Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const glm::vec2 Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const glm::ivec4 Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const glm::ivec3 Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); template const glm::ivec2 Core::jsonFindRequired (const nlohmann::json& data, const char* key, const char* notFoundMsg); nlohmann::json::const_iterator Core::jsonFindRequired ( const nlohmann::json::const_iterator& data, const char* key, const char* notFoundMsg ) { auto value = data->find (key); if (value == data->end ()) sLog.exception ("Cannot find required key (", key, ") in json: ", notFoundMsg); return value; } nlohmann::json::const_iterator Core::jsonFindRequired ( const nlohmann::json& data, const char* key, const char* notFoundMsg ) { auto value = data.find (key); if (value == data.end ()) sLog.exception ("Cannot find required key (", key, ") in json: ", notFoundMsg); return value; } template const T Core::jsonFindDefault ( const nlohmann::json::const_iterator& data, const char* key, const T defaultValue ) { const auto value = data->find (key); if (value == data->end () || value->type () == nlohmann::detail::value_t::null) return defaultValue; // vector types need of special handling if constexpr (std::is_same_v) { // std::strings are special, type checking doesn't need to happen, we just want the string representation // of whatever is in there if (value->is_number_integer ()) { return std::to_string (value->get ()); } else if (value->is_number_float ()) { return std::to_string (value->get ()); } else if (value->is_boolean()) { return std::to_string (value->get ()); } else if (value->is_null ()) { return "null"; } else if (value->is_string ()) { return *value; } } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector4 (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector3 (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector2 (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector4i (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector3i (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector2i (*value); } else if (typeCheck (value)) { return *value; } return defaultValue; } template const bool Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const bool defaultValue); template const std::string Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const std::string defaultValue); template const int16_t Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const int16_t defaultValue); template const uint16_t Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const uint16_t defaultValue); template const int32_t Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const int32_t defaultValue); template const uint32_t Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const uint32_t defaultValue); template const int64_t Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const int64_t defaultValue); template const uint64_t Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const uint64_t defaultValue); template const float Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const float defaultValue); template const double Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const double defaultValue); template const glm::vec2 Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const glm::vec2 defaultValue); template const glm::vec3 Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const glm::vec3 defaultValue); template const glm::vec4 Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const glm::vec4 defaultValue); template const glm::ivec2 Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const glm::ivec2 defaultValue); template const glm::ivec3 Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const glm::ivec3 defaultValue); template const glm::ivec4 Core::jsonFindDefault (const nlohmann::json::const_iterator& data, const char* key, const glm::ivec4 defaultValue); template const T Core::jsonFindDefault ( const nlohmann::json& data, const char* key, const T defaultValue ) { const auto value = data.find (key); if (value == data.end () || value->type () == nlohmann::detail::value_t::null) return defaultValue; // vector types need of special handling if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector4 (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector3 (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector2 (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector4i (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector3i (*value); } else if constexpr (std::is_same_v) { if (!typeCheck (value)) { return defaultValue; } return aToVector2i (*value); } else if (typeCheck (value)) { return *value; } return defaultValue; } template const bool Core::jsonFindDefault (const nlohmann::json& data, const char* key, const bool defaultValue); template const std::string Core::jsonFindDefault (const nlohmann::json& data, const char* key, const std::string defaultValue); template const int16_t Core::jsonFindDefault (const nlohmann::json& data, const char* key, const int16_t defaultValue); template const uint16_t Core::jsonFindDefault (const nlohmann::json& data, const char* key, const uint16_t defaultValue); template const int32_t Core::jsonFindDefault (const nlohmann::json& data, const char* key, const int32_t defaultValue); template const uint32_t Core::jsonFindDefault (const nlohmann::json& data, const char* key, const uint32_t defaultValue); template const int64_t Core::jsonFindDefault (const nlohmann::json& data, const char* key, const int64_t defaultValue); template const uint64_t Core::jsonFindDefault (const nlohmann::json& data, const char* key, const uint64_t defaultValue); template const float Core::jsonFindDefault (const nlohmann::json& data, const char* key, const float defaultValue); template const double Core::jsonFindDefault (const nlohmann::json& data, const char* key, const double defaultValue); template const glm::vec2 Core::jsonFindDefault (const nlohmann::json& data, const char* key, const glm::vec2 defaultValue); template const glm::vec3 Core::jsonFindDefault (const nlohmann::json& data, const char* key, const glm::vec3 defaultValue); template const glm::vec4 Core::jsonFindDefault (const nlohmann::json& data, const char* key, const glm::vec4 defaultValue); template const glm::ivec2 Core::jsonFindDefault (const nlohmann::json& data, const char* key, const glm::ivec2 defaultValue); template const glm::ivec3 Core::jsonFindDefault (const nlohmann::json& data, const char* key, const glm::ivec3 defaultValue); template const glm::ivec4 Core::jsonFindDefault (const nlohmann::json& data, const char* key, const glm::ivec4 defaultValue); template const T* Core::jsonFindUserConfig ( const nlohmann::json::const_iterator& data, const CProject& project, const char* key, typename T::data_type defaultValue ) { const auto it = data->find (key); if (it == data->end () || it->type () == nlohmann::detail::value_t::null) return T::fromScalar (defaultValue); return T::fromJSON (*it, project); } template const CUserSettingBoolean* Core::jsonFindUserConfig ( const nlohmann::json::const_iterator& data, const CProject& project, const char* key, CUserSettingBoolean::data_type defaultValue); template const CUserSettingVector3* Core::jsonFindUserConfig ( const nlohmann::json::const_iterator& data, const CProject& project, const char* key, CUserSettingVector3::data_type defaultValue); template const CUserSettingFloat* Core::jsonFindUserConfig ( const nlohmann::json::const_iterator& data, const CProject& project, const char* key, CUserSettingFloat::data_type defaultValue); template const T* Core::jsonFindUserConfig ( const nlohmann::json& data, const CProject& project, const char* key, typename T::data_type defaultValue ) { const auto it = data.find (key); if (it == data.end () || it->type () == nlohmann::detail::value_t::null) return T::fromScalar (defaultValue); return T::fromJSON (*it, project); } template const CUserSettingBoolean* Core::jsonFindUserConfig ( const nlohmann::json& data, const CProject& project, const char* key, CUserSettingBoolean::data_type defaultValue); template const CUserSettingVector3* Core::jsonFindUserConfig ( const nlohmann::json& data, const CProject& project, const char* key, CUserSettingVector3::data_type defaultValue); template const CUserSettingFloat* Core::jsonFindUserConfig ( const nlohmann::json& data, const CProject& project, const char* key, CUserSettingFloat::data_type defaultValue);