processAsync method

Future<String> processAsync({
  1. Map context = const {},
  2. List<MemberAccessor> memberAccessors = const [],
})

Evaluates the template into a string result asynchronously. The template may have multiple expressions which will be concatenated into the returned value.

Implementation

Future<String> processAsync({
  Map<dynamic, dynamic> context = const {},
  List<MemberAccessor<dynamic>> memberAccessors = const [],
}) async {
  final ctx = <String, Object>{};
  for (var entry in context.entries) {
    if (entry.key != null && entry.value != null) {
      ctx[entry.key.toString()] = entry.value;
    }
  }

  final prepared = _prepare();
  var data = prepared.data;

  final evaluator = ExpressionEvaluator.async(
    memberAccessors: memberAccessors,
  );
  for (var entry in prepared.entries) {
    try {
      final evaled = await evaluator
          .eval(
            Expression.parse(entry.content),
            ctx,
          )
          .first;
      data = entry.replace(
        data,
        evaled == null ? '' : evaled.toString().trim(),
      );
    } catch (e, stack) {
      _logger.severe('Unable to parse input: [${entry.content}]', e, stack);
      rethrow;
    }
  }

  return data;
}