12 using std::make_unique;
21 void ScriptMethods::registerConstants(
MinitScript* minitScript) {
24 void ScriptMethods::registerMethods(
MinitScript* minitScript) {
32 MethodScriptWaitForCondition(
MinitScript* minitScript): minitScript(minitScript) {}
33 const string getMethodName()
override {
34 return "script.waitForCondition";
37 if (arguments.size() == 0) {
46 minitScript->
registerMethod(
new MethodScriptWaitForCondition(minitScript));
56 { .type = MinitScript::TYPE_INTEGER, .name =
"time", .optional =
false, .reference =
false, .nullable =
false }
58 minitScript(minitScript) {}
59 const string getMethodName()
override {
64 if (arguments.size() == 1 &&
85 { .type = MinitScript::TYPE_STRING, .name =
"condition", .optional =
false, .reference =
false, .nullable =
false }
88 minitScript(minitScript) {}
89 const string getMethodName()
override {
94 if (arguments.size() == 1 &&
95 MinitScript::getStringValue(arguments, 0, condition) ==
true) {
96 minitScript->
emit(condition);
110 MethodScriptEnableNamedCondition(
MinitScript* minitScript):
113 { .type = MinitScript::TYPE_STRING, .name =
"name", .optional =
false, .reference =
false, .nullable =
false }
116 minitScript(minitScript) {}
117 const string getMethodName()
override {
118 return "script.enableNamedCondition";
122 if (arguments.size() == 1 &&
123 MinitScript::getStringValue(arguments, 0, name) ==
true) {
138 minitScript->
registerMethod(
new MethodScriptEnableNamedCondition(minitScript));
146 MethodScriptDisableNamedCondition(
MinitScript* minitScript):
149 { .type = MinitScript::TYPE_STRING, .name =
"name", .optional =
false, .reference =
false, .nullable =
false }
152 minitScript(minitScript) {}
153 const string getMethodName()
override {
154 return "script.disableNamedCondition";
158 if (arguments.size() == 1 &&
159 MinitScript::getStringValue(arguments, 0, name) ==
true) {
173 minitScript->
registerMethod(
new MethodScriptDisableNamedCondition(minitScript));
181 MethodScriptGetNamedConditions(
MinitScript* minitScript):
183 minitScript(minitScript) {}
184 const string getMethodName()
override {
185 return "script.getNamedConditions";
188 if (arguments.size() == 0) {
191 result+= result.empty() ==
false?
",":namedCondition;
199 minitScript->
registerMethod(
new MethodScriptGetNamedConditions(minitScript));
210 { .type = MinitScript::TYPE_STRING, .name =
"statement", .optional =
false, .reference =
false, .nullable =
false }
212 MinitScript::TYPE_PSEUDO_MIXED
214 minitScript(minitScript) {}
215 const string getMethodName()
override {
216 return "script.evaluate";
219 string statementString;
220 if (arguments.size() == 1 &&
221 minitScript->
getStringValue(arguments, 0, statementString) ==
true) {
222 if (minitScript->
evaluate(statementString, returnValue) ==
false) {
230 minitScript->
registerMethod(
new MethodScriptEvaluate(minitScript));
241 { .type = MinitScript::TYPE_STRING, .name =
"function", .optional =
false, .reference =
false, .nullable =
false }
243 MinitScript::TYPE_PSEUDO_MIXED
245 minitScript(minitScript) {}
246 const string getMethodName()
override {
247 return "script.call";
251 if (arguments.size() >= 1 &&
254 if (scriptIdx == MinitScript::SCRIPTIDX_NONE || minitScript->
getScripts()[scriptIdx].type != MinitScript::Script::TYPE_FUNCTION) {
257 #if defined (__clang__)
259 vector<MinitScript::Variable> callArguments(arguments.size() - 1);
260 for (
auto i = 1; i < arguments.size(); i++) callArguments[i - 1] = move(arguments[i]);
262 span callArgumentsSpan(callArguments);
263 minitScript->
call(scriptIdx, callArgumentsSpan, returnValue);
265 for (
auto i = 1; i < arguments.size(); i++) arguments[i] = move(callArguments[i - 1]);
267 span callArgumentsSpan(arguments.begin() + 1, arguments.end());
268 minitScript->
call(scriptIdx, callArgumentsSpan, returnValue);
275 bool isVariadic()
const override {
290 { .type = MinitScript::TYPE_INTEGER, .name =
"functionScriptIdx", .optional =
false, .reference =
false, .nullable =
false }
292 MinitScript::TYPE_PSEUDO_MIXED
294 minitScript(minitScript) {}
295 const string getMethodName()
override {
296 return "script.callByIndex";
299 int64_t functionScriptIdx;
300 if (arguments.size() >= 1 &&
301 minitScript->
getIntegerValue(arguments, 0, functionScriptIdx) ==
true) {
302 if (functionScriptIdx == MinitScript::SCRIPTIDX_NONE ||
303 functionScriptIdx < 0 ||
304 functionScriptIdx >= minitScript->
getScripts().size() ||
305 minitScript->
getScripts()[functionScriptIdx].type != MinitScript::Script::TYPE_FUNCTION) {
308 #if defined (__clang__)
310 vector<MinitScript::Variable> callArguments(arguments.size() - 1);
311 for (
auto i = 1; i < arguments.size(); i++) callArguments[i - 1] = move(arguments[i]);
313 span callArgumentsSpan(callArguments);
314 minitScript->
call(functionScriptIdx, callArgumentsSpan, returnValue);
316 for (
auto i = 1; i < arguments.size(); i++) arguments[i] = move(callArguments[i - 1]);
318 span callArgumentsSpan(arguments.begin() + 1, arguments.end());
319 minitScript->
call(functionScriptIdx, callArgumentsSpan, returnValue);
326 bool isVariadic()
const override {
329 bool isPrivate()
const override {
333 minitScript->
registerMethod(
new MethodScriptCallByIndex(minitScript));
341 MethodScriptCallFunction(
MinitScript* minitScript):
344 { .type = MinitScript::TYPE_FUNCTION_ASSIGNMENT, .name =
"function", .optional =
false, .reference =
false, .nullable =
false }
346 MinitScript::TYPE_PSEUDO_MIXED
348 minitScript(minitScript) {}
349 const string getMethodName()
override {
350 return "script.callFunction";
354 auto functionScriptIdx = MinitScript::SCRIPTIDX_NONE;
355 if (arguments.size() >= 1 &&
356 minitScript->
getFunctionValue(arguments, 0,
function, functionScriptIdx) ==
true) {
357 if (functionScriptIdx == MinitScript::SCRIPTIDX_NONE) {
360 if (functionScriptIdx == MinitScript::SCRIPTIDX_NONE || minitScript->
getScripts()[functionScriptIdx].type != MinitScript::Script::TYPE_FUNCTION) {
363 #if defined (__clang__)
365 vector<MinitScript::Variable> callArguments(arguments.size() - 1);
366 for (
auto i = 1; i < arguments.size(); i++) callArguments[i - 1] = move(arguments[i]);
368 span callArgumentsSpan(callArguments);
369 minitScript->
call(functionScriptIdx, callArgumentsSpan, returnValue);
371 for (
auto i = 1; i < arguments.size(); i++) arguments[i] = move(callArguments[i - 1]);
373 span callArgumentsSpan(arguments.begin() + 1, arguments.end());
374 minitScript->
call(functionScriptIdx, callArgumentsSpan, returnValue);
381 bool isVariadic()
const override {
385 minitScript->
registerMethod(
new MethodScriptCallFunction(minitScript));
393 MethodScriptCallStacklet(
MinitScript* minitScript):
396 { .type = MinitScript::TYPE_STRING, .name =
"stacklet", .optional =
false, .reference =
false, .nullable =
false }
398 MinitScript::TYPE_PSEUDO_MIXED
400 minitScript(minitScript) {}
401 const string getMethodName()
override {
402 return "script.callStacklet";
406 if (arguments.size() >= 1 &&
409 if (scriptIdx == MinitScript::SCRIPTIDX_NONE || minitScript->
getScripts()[scriptIdx].type != MinitScript::Script::TYPE_STACKLET) {
412 vector<MinitScript::Variable> callArguments(0);
413 span callArgumentsSpan(callArguments);
414 minitScript->
callStacklet(scriptIdx, callArgumentsSpan, returnValue);
421 minitScript->
registerMethod(
new MethodScriptCallStacklet(minitScript));
429 MethodScriptCallStackletByIndex(
MinitScript* minitScript):
432 { .type = MinitScript::TYPE_INTEGER, .name =
"stackletScriptIndex", .optional =
false, .reference =
false, .nullable =
false }
434 MinitScript::TYPE_PSEUDO_MIXED
436 minitScript(minitScript) {}
437 const string getMethodName()
override {
438 return "script.callStackletByIndex";
441 int64_t stackletScriptIdx;
442 if (arguments.size() == 1 &&
443 minitScript->
getIntegerValue(arguments, 0, stackletScriptIdx) ==
true) {
444 if (stackletScriptIdx == MinitScript::SCRIPTIDX_NONE ||
445 stackletScriptIdx < 0 ||
446 stackletScriptIdx >= minitScript->
getScripts().size() ||
447 minitScript->
getScripts()[stackletScriptIdx].type != MinitScript::Script::TYPE_STACKLET) {
450 vector<MinitScript::Variable> callArguments(0);
451 span callArgumentsSpan(callArguments);
452 minitScript->
callStacklet(stackletScriptIdx, callArgumentsSpan, returnValue);
458 bool isPrivate()
const override {
462 minitScript->
registerMethod(
new MethodScriptCallStackletByIndex(minitScript));
471 const string getMethodName()
override {
472 return "script.stop";
475 if (arguments.size() == 0) {
492 const string getMethodName()
override {
493 return "script.getVariables";
496 if (arguments.size() == 0) {
497 returnValue.
setType(MinitScript::TYPE_MAP);
499 returnValue.
setMapEntry(variableName, *variableValue);
506 minitScript->
registerMethod(
new MethodScriptGetVariables(minitScript));
515 minitScript(minitScript) {}
517 const string getMethodName()
override {
518 return "script.isNative";
521 if (arguments.size() == 0) {
528 minitScript->
registerMethod(
new MethodScriptIsNative(minitScript));
536 MethodScriptErrorGetMessage(
MinitScript* minitScript):
538 minitScript(minitScript) {}
539 const string getMethodName()
override {
540 return "script.error.getMessage";
543 if (arguments.size() == 0) {
545 if (errorSubStatement.statement !=
nullptr) {
553 minitScript->
registerMethod(
new MethodScriptErrorGetMessage(minitScript));
561 MethodScriptErrorGetStatement(
MinitScript* minitScript):
563 minitScript(minitScript) {}
564 const string getMethodName()
override {
565 return "script.error.getStatement";
568 if (arguments.size() == 0) {
570 if (errorSubStatement.statement !=
nullptr) {
571 returnValue.
setType(MinitScript::TYPE_MAP);
583 minitScript->
registerMethod(
new MethodScriptErrorGetStatement(minitScript));
#define MINITSCRIPT_METHODUSAGE_COMPLAINM(methodName, message)
#define MINITSCRIPT_METHODUSAGE_COMPLAIN(methodName)
void setMapEntry(const string &key, const Variable &value, bool _private=false)
Set entry in map with given key.
void setType(VariableType newType)
Set type.
void setValue(const Variable &variable)
Set value from given variable into variable.
const string & getScriptPathName()
const SubStatement & getErrorSubStatement()
void registerMethod(Method *method)
Register method.
int getFunctionScriptIdx(const string &function)
Return function script index by function name.
void setScriptStateState(int state)
Set script state machine state.
bool call(int scriptIdx, span< Variable > &arguments, Variable &returnValue, bool pushScriptState)
Call function.
void stopScriptExecution()
Stop script execution.
bool callStacklet(int scriptIdx, span< Variable > &arguments, Variable &returnValue)
Call stacklet.
virtual void emit(const string &condition)
Emit.
static bool getStringValue(const span< Variable > &arguments, int idx, string &value, bool optional=false)
Get string value from given variable.
const string & getErrorMessage()
const string getSubStatementInformation(const SubStatement &subStatement)
Return sub statement information.
vector< string > enabledNamedConditions
const string & getScriptFileName()
void stopRunning()
Set running flag to false.
static bool getFunctionValue(const span< Variable > &arguments, int idx, string &function, int &scriptIdx, bool optional=false)
Get function value from given variable.
ScriptState & getScriptState()
const vector< Script > & getScripts()
static bool getIntegerValue(const span< Variable > &arguments, int idx, int64_t &value, bool optional=false)
Get integer value from given variable.
bool evaluate(const string &evaluateStatement, Variable &returnValue)
Evaluate statement.
MinitScript script script methods.
static void printLine()
Print newline to console.
static int64_t getCurrentMillis()
Retrieve current time in milliseconds.
unordered_map< string, Variable * > variables