#if !defined(LUA_ENGINE_H) #define LUA_ENGINE_H #include "Service.h" #include "Cache.h" #include #include #include #include "DBLogger.h" #include "croncpp/croncpp.h" #include #include #include "spdlog/spdlog.h" struct ScheduledService { cron::cronexpr cron; std::time_t next_run; LuaService* service; std::string callback; void next(); bool operator<(const ScheduledService& rhs) const; }; class LuaEngine { private: LuaEngine(); public: std::function publish; DBLogger db_logger; std::priority_queue time_schedule; static LuaEngine& get_instance() { static LuaEngine instance; return instance; } std::vector services; Cache cache; void load_services(); void start_services(); LuaService* create_service(std::string filename); LuaService* service_by_lua_state(lua_State* lua); LuaEngine(LuaEngine const&) = delete; void operator=(LuaEngine const&) = delete; }; template inline bool check_arguments(lua_State* lua, int stack_pos) { return check_arguments(lua, stack_pos+1) && check_arguments(lua, stack_pos); } template inline bool check_arguments(lua_State* lua) { int num_arg = sizeof...(Args) + 1; return check_arguments(lua, num_arg * -1); } template <> inline bool check_arguments(lua_State* lua, int stack_pos) { return lua_isstring(lua, stack_pos); } template <> inline bool check_arguments(lua_State* lua, int stack_pos) { return lua_isnumber(lua, stack_pos); } template <> inline bool check_arguments(lua_State* lua, int stack_pos) { return lua_isnumber(lua, stack_pos); } template void lua_func_call(LuaService& service, const std::string& lua_func, F push_params) { lua_getglobal(service.lua, lua_func.c_str()); int num_arguments = push_params(); if (lua_pcall(service.lua, num_arguments, 0, 0) != 0) { spdlog::error("[{}] Unable to call '{}'. [Lua: '{}']", lua_func, service.name); return; } } #endif // LUA_ENGINE_H