templator function
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;
}