#pragma once #include #include #include "../shape/Shape.h" class ErrorListener { public: virtual void onError(int lineNumber, juce::String error) = 0; virtual juce::String getFileName() = 0; }; struct lua_State; class LuaParser { public: LuaParser(juce::String fileName, juce::String script, std::function errorCallback, juce::String fallbackScript = "return { 0.0, 0.0 }"); ~LuaParser(); std::vector run(); void setVariable(juce::String variableName, double value); bool isFunctionValid(); juce::String getScript(); void resetErrors(); private: void reset(juce::String script); void reportError(const char* error); void parse(); static int panic(lua_State* L); int functionRef = -1; bool usingFallbackScript = false; long step = 1; lua_State* L = nullptr; juce::String script; juce::String fallbackScript; std::atomic updateVariables = false; juce::SpinLock variableLock; std::vector variableNames; std::vector variables; std::function errorCallback; juce::String fileName; };