#pragma once #include #include #include #include "../shape/Shape.h" class ErrorListener { public: virtual void onError(int lineNumber, juce::String error) = 0; virtual juce::String getFileName() = 0; }; struct LuaVariables { double sampleRate; double frequency; }; struct lua_State; class LuaParser { public: LuaParser(juce::String fileName, juce::String script, std::function errorCallback, juce::String fallbackScript = "return { 0.0, 0.0 }"); std::vector run(lua_State*& L, const LuaVariables vars, long& step, double& phase); void setVariable(juce::String variableName, double value); bool isFunctionValid(); juce::String getScript(); void resetErrors(); void close(lua_State*& L); private: void reset(lua_State*& L, juce::String script); void reportError(const char* error); void parse(lua_State*& L); int functionRef = -1; bool usingFallbackScript = false; 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; std::vector seenStates; std::vector staleStates; };