diff --git a/src/config/lua/ConfigManager.cpp b/src/config/lua/ConfigManager.cpp index 0fe75b18b..0dd962000 100644 --- a/src/config/lua/ConfigManager.cpp +++ b/src/config/lua/ConfigManager.cpp @@ -712,18 +712,18 @@ ILuaConfigValue* CConfigManager::findDeviceValue(const std::string& dev, const s int CConfigManager::getDeviceInt(const std::string& dev, const std::string& field, const std::string& fb) { std::string fallback = luaConfigValueName(fb); if (auto* v = findDeviceValue(normalizeDeviceName(dev), luaConfigValueName(field)); v && v->setByUser()) - return (int)*sc(v->data()); + return v->asInt(); if (!fallback.empty() && m_configValues.contains(fallback)) - return (int)*sc(m_configValues.at(fallback)->data()); + return m_configValues.at(fallback)->asInt(); return 0; } float CConfigManager::getDeviceFloat(const std::string& dev, const std::string& field, const std::string& fb) { std::string fallback = luaConfigValueName(fb); if (auto* v = findDeviceValue(normalizeDeviceName(dev), luaConfigValueName(field)); v && v->setByUser()) - return *sc(v->data()); + return v->asFloat(); if (!fallback.empty() && m_configValues.contains(fallback)) - return *sc(m_configValues.at(fallback)->data()); + return m_configValues.at(fallback)->asFloat(); return 0.F; } @@ -731,9 +731,9 @@ Vector2D CConfigManager::getDeviceVec(const std::string& dev, const std::string& std::string fallback = luaConfigValueName(fb); auto toVec = [](const Config::VEC2& v) -> Vector2D { return {v.x, v.y}; }; if (auto* v = findDeviceValue(normalizeDeviceName(dev), luaConfigValueName(field)); v && v->setByUser()) - return toVec(*sc(v->data())); + return toVec(v->asVec2()); if (!fallback.empty() && m_configValues.contains(fallback)) - return toVec(*sc(m_configValues.at(fallback)->data())); + return toVec(m_configValues.at(fallback)->asVec2()); return {0, 0}; } @@ -741,9 +741,9 @@ std::string CConfigManager::getDeviceString(const std::string& dev, const std::s std::string fallback = luaConfigValueName(fb); auto clean = [](const Config::STRING& s) -> std::string { return s == STRVAL_EMPTY ? "" : s; }; if (auto* v = findDeviceValue(normalizeDeviceName(dev), luaConfigValueName(field)); v && v->setByUser()) - return clean(*sc(v->data())); + return clean(v->asString()); if (!fallback.empty() && m_configValues.contains(fallback)) - return clean(*sc(m_configValues.at(fallback)->data())); + return clean(m_configValues.at(fallback)->asString()); return ""; } diff --git a/src/config/lua/types/LuaConfigBool.cpp b/src/config/lua/types/LuaConfigBool.cpp index 15413598f..2162d0b0f 100644 --- a/src/config/lua/types/LuaConfigBool.cpp +++ b/src/config/lua/types/LuaConfigBool.cpp @@ -43,6 +43,10 @@ void CLuaConfigBool::push(lua_State* s) { lua_pushboolean(s, m_data); } +Config::INTEGER CLuaConfigBool::asInt() { + return m_data ? 1 : 0; +} + const Config::BOOL& CLuaConfigBool::parsed() { return m_data; } diff --git a/src/config/lua/types/LuaConfigBool.hpp b/src/config/lua/types/LuaConfigBool.hpp index b4644aa4c..bda06adca 100644 --- a/src/config/lua/types/LuaConfigBool.hpp +++ b/src/config/lua/types/LuaConfigBool.hpp @@ -14,6 +14,7 @@ namespace Config::Lua { virtual std::string toString(); virtual void push(lua_State* s); virtual void reset(); + virtual Config::INTEGER asInt(); const Config::BOOL& parsed(); diff --git a/src/config/lua/types/LuaConfigFloat.cpp b/src/config/lua/types/LuaConfigFloat.cpp index 9d2574b68..be3fd7497 100644 --- a/src/config/lua/types/LuaConfigFloat.cpp +++ b/src/config/lua/types/LuaConfigFloat.cpp @@ -71,6 +71,10 @@ void CLuaConfigFloat::push(lua_State* s) { lua_pushnumber(s, m_data); } +Config::FLOAT CLuaConfigFloat::asFloat() { + return m_data; +} + const Config::FLOAT& CLuaConfigFloat::parsed() { return m_data; } diff --git a/src/config/lua/types/LuaConfigFloat.hpp b/src/config/lua/types/LuaConfigFloat.hpp index e6602b5a3..16263b7ef 100644 --- a/src/config/lua/types/LuaConfigFloat.hpp +++ b/src/config/lua/types/LuaConfigFloat.hpp @@ -16,6 +16,7 @@ namespace Config::Lua { virtual std::string toString(); virtual void push(lua_State* s); virtual void reset(); + virtual Config::FLOAT asFloat(); const Config::FLOAT& parsed(); diff --git a/src/config/lua/types/LuaConfigInt.cpp b/src/config/lua/types/LuaConfigInt.cpp index ef96a056c..24220e87c 100644 --- a/src/config/lua/types/LuaConfigInt.cpp +++ b/src/config/lua/types/LuaConfigInt.cpp @@ -79,6 +79,10 @@ void CLuaConfigInt::push(lua_State* s) { lua_pushinteger(s, m_data); } +Config::INTEGER CLuaConfigInt::asInt() { + return m_data; +} + const Config::INTEGER& CLuaConfigInt::parsed() { return m_data; } diff --git a/src/config/lua/types/LuaConfigInt.hpp b/src/config/lua/types/LuaConfigInt.hpp index 7ff2f39c5..02322159d 100644 --- a/src/config/lua/types/LuaConfigInt.hpp +++ b/src/config/lua/types/LuaConfigInt.hpp @@ -19,6 +19,7 @@ namespace Config::Lua { virtual std::string toString(); virtual void push(lua_State* s); virtual void reset(); + virtual Config::INTEGER asInt(); const Config::INTEGER& parsed(); diff --git a/src/config/lua/types/LuaConfigString.cpp b/src/config/lua/types/LuaConfigString.cpp index c16a587bb..e35d5f1ba 100644 --- a/src/config/lua/types/LuaConfigString.cpp +++ b/src/config/lua/types/LuaConfigString.cpp @@ -47,6 +47,10 @@ void CLuaConfigString::push(lua_State* s) { lua_pushstring(s, m_data.c_str()); } +Config::STRING CLuaConfigString::asString() { + return m_data; +} + const Config::STRING& CLuaConfigString::parsed() { return m_data; } diff --git a/src/config/lua/types/LuaConfigString.hpp b/src/config/lua/types/LuaConfigString.hpp index d976b6abc..c823e553e 100644 --- a/src/config/lua/types/LuaConfigString.hpp +++ b/src/config/lua/types/LuaConfigString.hpp @@ -18,6 +18,7 @@ namespace Config::Lua { virtual std::string toString(); virtual void push(lua_State* s); virtual void reset(); + virtual Config::STRING asString(); const Config::STRING& parsed(); diff --git a/src/config/lua/types/LuaConfigUtils.hpp b/src/config/lua/types/LuaConfigUtils.hpp index d61cf47a9..44b3d1897 100644 --- a/src/config/lua/types/LuaConfigUtils.hpp +++ b/src/config/lua/types/LuaConfigUtils.hpp @@ -6,4 +6,4 @@ namespace Config::Lua { UP fromGenericValue(SP v); -}; \ No newline at end of file +}; diff --git a/src/config/lua/types/LuaConfigValue.cpp b/src/config/lua/types/LuaConfigValue.cpp index 38141baad..8d3027cd4 100644 --- a/src/config/lua/types/LuaConfigValue.cpp +++ b/src/config/lua/types/LuaConfigValue.cpp @@ -1,5 +1,7 @@ #include "LuaConfigValue.hpp" +#include "../../../macros.hpp" + using namespace Config; using namespace Config::Lua; @@ -18,3 +20,23 @@ void ILuaConfigValue::setRefreshBits(Supplementary::PropRefreshBits bits) { Supplementary::PropRefreshBits ILuaConfigValue::refreshBits() const { return m_refreshBits; } + +Config::INTEGER ILuaConfigValue::asInt() { + RASSERT(false, "Lua config value cannot be read as int"); + return 0; +} + +Config::FLOAT ILuaConfigValue::asFloat() { + RASSERT(false, "Lua config value cannot be read as float"); + return 0.F; +} + +Config::VEC2 ILuaConfigValue::asVec2() { + RASSERT(false, "Lua config value cannot be read as vec2"); + return {}; +} + +Config::STRING ILuaConfigValue::asString() { + RASSERT(false, "Lua config value cannot be read as string"); + return {}; +} diff --git a/src/config/lua/types/LuaConfigValue.hpp b/src/config/lua/types/LuaConfigValue.hpp index 2cce98e39..93e8b755a 100644 --- a/src/config/lua/types/LuaConfigValue.hpp +++ b/src/config/lua/types/LuaConfigValue.hpp @@ -41,6 +41,10 @@ namespace Config::Lua { virtual void push(lua_State* s) = 0; virtual void reset() = 0; + virtual Config::INTEGER asInt(); + virtual Config::FLOAT asFloat(); + virtual Config::VEC2 asVec2(); + virtual Config::STRING asString(); virtual void resetSetByUser(); virtual bool setByUser(); virtual void setRefreshBits(Supplementary::PropRefreshBits bits); diff --git a/src/config/lua/types/LuaConfigVec2.cpp b/src/config/lua/types/LuaConfigVec2.cpp index 5e92de620..cfda0c1b6 100644 --- a/src/config/lua/types/LuaConfigVec2.cpp +++ b/src/config/lua/types/LuaConfigVec2.cpp @@ -91,6 +91,10 @@ void CLuaConfigVec2::push(lua_State* s) { lua_setfield(s, -2, "y"); } +Config::VEC2 CLuaConfigVec2::asVec2() { + return m_data; +} + const Config::VEC2& CLuaConfigVec2::parsed() { return m_data; } diff --git a/src/config/lua/types/LuaConfigVec2.hpp b/src/config/lua/types/LuaConfigVec2.hpp index c65601210..80a8ce735 100644 --- a/src/config/lua/types/LuaConfigVec2.hpp +++ b/src/config/lua/types/LuaConfigVec2.hpp @@ -18,6 +18,7 @@ namespace Config::Lua { virtual std::string toString(); virtual void push(lua_State* s); virtual void reset(); + virtual Config::VEC2 asVec2(); const Config::VEC2& parsed(); diff --git a/tests/config/lua/LuaConfigUtils.cpp b/tests/config/lua/LuaConfigUtils.cpp index a165755eb..5a7af36f4 100644 --- a/tests/config/lua/LuaConfigUtils.cpp +++ b/tests/config/lua/LuaConfigUtils.cpp @@ -103,3 +103,22 @@ TEST(ConfigLuaUtils, fromGenericValueCopiesRefreshBits) { ASSERT_NE(out.get(), nullptr); EXPECT_EQ(out->refreshBits(), REFRESH); } + +TEST(ConfigLuaUtils, typedAccessorsReadStoredValues) { + CLuaConfigBool boolFalse(false); + CLuaConfigBool boolTrue(true); + CLuaConfigInt intValue(2); + CLuaConfigFloat floatValue(1.25F); + CLuaConfigVec2 vecValue({3, 4}); + CLuaConfigString stringValue("value"); + + EXPECT_EQ(boolFalse.asInt(), 0); + EXPECT_EQ(boolTrue.asInt(), 1); + EXPECT_EQ(intValue.asInt(), 2); + EXPECT_FLOAT_EQ(floatValue.asFloat(), 1.25F); + + const auto vec = vecValue.asVec2(); + EXPECT_EQ(vec.x, 3); + EXPECT_EQ(vec.y, 4); + EXPECT_EQ(stringValue.asString(), "value"); +}