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) {
      return values.subTasks?[idx ?? 0][mapKey];
    },
    'C': (String mapKey, int? index) => values.currentUser?[mapKey] ?? "",
    'R': (String mapKey, int? index) => values.rewardDetails?[mapKey] ?? "",
    'S': (String mapKey, int? index) {
      return "ref";
    },
  };

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

    String defaultValue = '';

    if (keyParts.length >= 2) {
      String prefix = keyParts[0];
      if (prefix == "D") {
        String mapKey = keyParts.sublist(2).join('.');
        int idx = 0;
        if (keyParts[1] == 'L') {
          idx = index ?? 0;
        } else {
          idx = int.parse(keyParts[1]);
          defaultValue = mapKey.contains('=') ? mapKey.split('=')[1] : '';
        }

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

      if (prefix == "U") {
        String mapKey = keyParts.sublist(1).join('.');
        defaultValue = mapKey.contains('=') ? mapKey.split('=')[1] : '';
        return (keyHandlers[prefix]!(mapKey, index) ?? defaultValue).toString();
      }

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

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

        if (values.users != null && values.users!.length <= indexKey) {
          return defaultValue;
        }

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

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

      if (keyHandlers.containsKey(prefix)) {
        return keyHandlers[prefix]!(mapKey, 0).toString() ?? defaultValue;
      }
    } else if (keyParts.length == 1) {
      if (keyHandlers.containsKey(keyParts[0])) {
        return keyHandlers[keyParts[0]]!('', 0) ?? defaultValue;
      }
    }

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

  return result;
}