replaceParameters method

String replaceParameters(
  1. JsonRow params,
  2. string parameterMatch
)

Replaces the placeholders in the String with the values from the provided params list. The placeholders are defined by the parameterMatch parameter. The parameterMatch parameter is a String that defines the placeholder prefix.

Implementation

String replaceParameters(JsonRow params, string parameterMatch) {
  String query = this;

  if (parameterMatch.isBlank) throw ArgumentError.value(parameterMatch, "parameterMatch", "parameterMatch cannot be blank");

  // convert params to string
  Map<String, dynamic> convertedParams = {};

  for (final param in params.entries) {
    convertedParams[param.key] = (param.value as Object?).toString();
  }

  // find all :placeholders, which can be substituted
  final pattern = RegExp("$parameterMatch(\\w+)");

  final matches = pattern.allMatches(query).where((match) {
    final subString = query.substring(0, match.start);

    int count = "'".allMatches(subString).length;
    if (count > 0 && count.isOdd) {
      return false;
    }

    count = '"'.allMatches(subString).length;
    if (count > 0 && count.isOdd) {
      return false;
    }

    return true;
  }).toList();

  int lengthShift = 0;

  for (final match in matches) {
    final paramName = match.group(1);

    // check param exists
    if (false == convertedParams.containsKey(paramName)) {
      convertedParams[paramName!] = "";
    }

    final newQuery = query.replaceFirst(
      match.group(0)!,
      convertedParams[paramName]!.toString(),
      match.start + lengthShift,
    );

    lengthShift += newQuery.length - query.length;
    query = newQuery;
  }

  return query;
}