resolvePath method
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;
}