Add an index metafunction that throws an error. This will prevent the end user from accidentally reading a value which does not exist (as happened to me because of a typo).

This commit is contained in:
hispidence 2021-07-04 14:37:50 +01:00
parent 2dd4f546fa
commit a29326f407

View file

@ -11,6 +11,8 @@
extern bool const WarningsAsErrors; extern bool const WarningsAsErrors;
constexpr auto LUA_CLASS_NAME{ "ItemInfo" };
GameScriptItemInfo::GameScriptItemInfo(short num) : m_item{ &g_Level.Items[num]}, m_num { num } GameScriptItemInfo::GameScriptItemInfo(short num) : m_item{ &g_Level.Items[num]}, m_num { num }
{}; {};
@ -25,10 +27,20 @@ GameScriptItemInfo::~GameScriptItemInfo() {
} }
} }
static void index_error(GameScriptItemInfo & item, sol::object key)
{
std::string err = "Attempted to read non-existant var \"" + key.as<std::string>() + "\" from " + LUA_CLASS_NAME;
if (WarningsAsErrors)
{
throw std::runtime_error(err);
}
}
void GameScriptItemInfo::Register(sol::state* state) void GameScriptItemInfo::Register(sol::state* state)
{ {
state->new_usertype<GameScriptItemInfo>("ItemInfo", state->new_usertype<GameScriptItemInfo>(LUA_CLASS_NAME,
"new", sol::overload(&GameScriptItemInfo::Create, &GameScriptItemInfo::CreateEmpty), "new", sol::overload(&GameScriptItemInfo::Create, &GameScriptItemInfo::CreateEmpty),
sol::meta_function::index, &index_error,
"Init", &GameScriptItemInfo::Init, "Init", &GameScriptItemInfo::Init,
"currentAnim", sol::property(&GameScriptItemInfo::GetCurrentAnim, &GameScriptItemInfo::SetCurrentAnim), "currentAnim", sol::property(&GameScriptItemInfo::GetCurrentAnim, &GameScriptItemInfo::SetCurrentAnim),
"requiredAnim", sol::property(&GameScriptItemInfo::GetRequiredAnim, &GameScriptItemInfo::SetRequiredAnim), "requiredAnim", sol::property(&GameScriptItemInfo::GetRequiredAnim, &GameScriptItemInfo::SetRequiredAnim),