resolvePath method

String resolvePath({
  1. Map<String, dynamic>? pathParams,
  2. dynamic input,
})

Interpolates path parameters into pathTemplate, percent-encoding all parameter values.

Looks up parameter values first in pathParams, and falls back to inspecting fields in input when input is a Map.

Throws a BloomRpcPathParameterException if any parameter defined in pathTemplate is missing or null, ensuring malformed URLs with literal :param tokens are never dispatched.

final path = contract.resolvePath(pathParams: {'id': 'user 123'});
// Produces: '/users/user%20123'

Implementation

String resolvePath({Map<String, dynamic>? pathParams, dynamic input}) {
  final params = pathParameters;
  if (params.isEmpty) {
    return pathTemplate;
  }

  Map<String, dynamic>? inputMap;
  if (input is Map<String, dynamic>) {
    inputMap = input;
  } else if (input is Map) {
    inputMap = Map<String, dynamic>.from(input);
  }

  var resolved = pathTemplate;
  for (final param in params) {
    dynamic val;
    if (pathParams != null && pathParams.containsKey(param)) {
      val = pathParams[param];
    } else if (inputMap != null && inputMap.containsKey(param)) {
      val = inputMap[param];
    }

    if (val == null) {
      throw BloomRpcPathParameterException(
        paramName: param,
        pathTemplate: pathTemplate,
        method: method.value,
      );
    }

    final encoded = Uri.encodeComponent(val.toString());
    resolved = resolved.replaceAll(':$param', encoded);
  }
  return resolved;
}