dhisD2Functions function

String dhisD2Functions(
  1. String expression,
  2. Map<String, dynamic> variableHash
)

Implementation

String dhisD2Functions(String expression, Map<String, dynamic> variableHash) {
  // 1. Remove whitespace
  String evalExpression = expression.replaceAll(RegExp(r'\s+'), '');

  if (evalExpression.contains('d2:')) {
    bool continueLooping = true;

    for (int i = 0; i < 10 && continueLooping; i++) {
      bool expressionUpdated = false;
      bool brokenExecution = false;

      d2FunctionsVariables.forEach((d2FnVar) {
        String name = d2FnVar.name;

        Iterable<Match> fnRegexCallArr =
            getMatches(evalExpression, name).toList();

        if (fnRegexCallArr is List<Match> && fnRegexCallArr.isNotEmpty) {
          fnRegexCallArr.forEach((fnRegexCall) {
            String fnParameters = fnRegexCall
                .group(0)!
                .replaceAll(RegExp('(^[^\\(]+\\()|\\)\$'), '')
                .trim();

            List<String?>? parameters = fnParameters.split(',');

            if (d2FnVar.parameters != null) {
              int numOfParameters = parameters.length;
              if (numOfParameters != d2FnVar.parameters) {
                brokenExecution = true;
              }
            }

            // if (!brokenExecution ) {
            //   for (int i = 0; i < parameters.length; i++) {
            //     parameters[i] = runRuleExpression(
            //       parameters[i] ?? '',
            //       d2FnVar.name,
            //       'parameter:$i',
            //       variableHash,
            //     ) as String?;
            //   }
            // }

            if (brokenExecution) {
              evalExpression =
                  evalExpression.replaceFirst(fnRegexCall.group(0)!, 'false');
              expressionUpdated = true;
            }

            Map<String, dynamic> results = d2FunctionsEval[d2FnVar.name]!(
              evalExpression,
              parameters,
              variableHash,
              fnRegexCall.group(0)!,
            );

            evalExpression = results['expression'];
            expressionUpdated = results['expressionUpdated'];
          });
        }
      });

      if (expressionUpdated && evalExpression.contains('d2:')) {
        continueLooping = true;
      } else {
        continueLooping = false;
      }
    }
  }

  return evalExpression.contains("d2:") ? "" : evalExpression;
}