templator function

String templator(
  1. String template,
  2. CentralDataRepository values,
  3. int? index
)

Implementation

String templator(String template, CentralDataRepository values, int? index) {
  final RegExp regExp = RegExp(r'\{\{([^}]+)\}\}');

  // logger.e("Inside templator with template: $template");

  Map<String, String> parsePlaceholder(String placeholder) {
    List<String> parts = placeholder.split(' ');
    String key = parts[0].trim();
    String defaultValue = parts.length > 1 ? parts.sublist(1).join(' ') : '';
    return {'key': key, 'defaultValue': defaultValue};
  }

  final Map<String, Function(String, int? index)> keyHandlers = {
    'U': (String mapKey, int? index) => values.userProps[mapKey],
    'D': (String mapKey, int? idx) =>
        values.subTasks?[index ?? idx ?? 0][mapKey],
    'C': (String mapKey, int? index) => values.currentUser?[mapKey],
    'R': (String mapKey, int? index) => values.rewardDetails?[mapKey],
  };

  String result = template.replaceAllMapped(regExp, (match) {
    String placeholder = match.group(1)!.trim();
    Map<String, String> parsed = parsePlaceholder(placeholder);
    String key = parsed['key']!;
    String defaultValue = parsed['defaultValue']!;
    List<String> keyParts = key.split('.');

    if (keyParts.length >= 2) {
      String prefix = keyParts[0];

      if (prefix == "D") {
        String mapKey = keyParts.sublist(2).join('.') +
            (defaultValue.isNotEmpty ? " $defaultValue" : '');
        int idx = int.parse(keyParts[1]);

        return keyHandlers[prefix]!(mapKey, idx) ?? defaultValue;
      }

      if (prefix == "L") {
        if (keyParts[1] == 'l') {
          return values.users?[index ?? 0][keyParts[2]] ?? defaultValue;
        }

        int indexKey = int.parse(keyParts[1]);

        return values.users?[indexKey][keyParts[2]] ?? defaultValue;
      }

      String mapKey = keyParts.sublist(1).join('.');

      log("Map Key: $mapKey");

      if (keyHandlers.containsKey(prefix)) {
        return keyHandlers[prefix]!(mapKey, 0) ?? defaultValue;
      }
    }

    return values.subTasks?[index ?? 0][key] ?? defaultValue;
  });

  return result;
}