urldat function

String urldat(
  1. String base,
  2. String pathOrTemplate, {
  3. Map<String, dynamic>? parameters,
})

Function that takes base string URL and pathOrTemplate string URL. pathOrTemplate can be either:

  • path segment like /path/to/something
  • or path segment template like /users/:id/comments/

If parameters map is provided, the template keys in pathOrTemplate are substituted with the values from parameters. Extra keys in parameters that do not map to pathOrTemplate are always used as query parameters.

If pathOrTemplate is template (contains :) and no parameters are provided, UrldatError exception will be thrown.

Implementation

String urldat(
  String base,
  String pathOrTemplate, {
  Map<String, dynamic>? parameters,
}) {
  final sanitizedBase = removeTrailingSlash(base);
  final sanitizedPathWithoutSlash =
      removeLeadingAndTrailingSlash(pathOrTemplate);
  final sanitizedPath = removeTrailingQuestionMark(sanitizedPathWithoutSlash);

  if (isTemplate(sanitizedPath)) {
    if (parameters == null) {
      throw UrldatError(
          'When using path templates, you must pass parameters map.');
    }

    if (parameters.isEmpty) {
      throw UrldatError(
          'When using path templates, you must pass non-empty parameters map.');
    }

    final templateKeys = getTemplateKeys(sanitizedPath);
    final queryParameterKeys =
        getQueryParameterKeys(templateKeys, parameters.keys.toSet());

    final filledTemplate =
        fillTemplateWithValues(sanitizedPath, templateKeys, parameters);
    final queryParameters =
        createQueryParametersWithKeys(parameters, queryParameterKeys);

    return joinParts(
      base: sanitizedBase,
      path: filledTemplate,
      query: queryParameters,
    );
  }

  final queryParameters = createQueryParameters(parameters);

  return joinParts(
    base: sanitizedBase,
    path: sanitizedPath,
    query: queryParameters,
  );
}