evaluate method
Implementation
Future<String?> evaluate(
String expression, Map<String?, dynamic> variables) async {
var i = 0;
var myExpression = expression;
var myVariables = <String, dynamic>{};
try {
// format the expression
if (myExpression.contains(nonQuotedSemiColons)) {
myExpression = formatExpression(myExpression);
}
// build variable map and modify expression
variables.forEach((key, value) {
i++;
var myKey = "___V$i";
myVariables[myKey] = toNum(value, allowMalformed: false) ??
toBool(value, allowFalse: ['false'], allowTrue: ['true']) ??
value;
myExpression = myExpression.replaceAll("$key", myKey);
});
variables.clear();
variables.addAll(myVariables);
// parse the expression
var myParsedResult = Expression.tryParse(myExpression);
var myParsedExpression =
(myParsedResult is Success) ? myParsedResult.value : null;
// Unable to preparse
if (myParsedExpression == null) {
Log().debug(
'Failed to parse $myParsedExpression. Error is ${myParsedResult.message}');
return null;
}
// format call and conditional expressions as string variables
if (myParsedExpression is ConditionalExpression) {
// build event expressions as variables
var events = getConditionals(myParsedExpression);
events.sort((a, b) => Comparable.compare(b.length, a.length));
myExpression = myParsedExpression.toString();
for (var e in events) {
i++;
var key = "___V$i";
myVariables[key] = e;
myExpression = myExpression.replaceAll(e, key);
}
// execute the expression and return the result
myExpression =
(await Eval.evaluate(myExpression, variables: myVariables))
.toString();
}
} catch (e) {
Log().exception(e);
return '';
}
return myExpression;
}