resolveIri function

String resolveIri(
  1. String iri,
  2. String? baseIri
)

Converts a relative IRI to absolute form using a base IRI.

Takes a potentially relative iri and resolves it against baseIri to produce an absolute IRI. This is the inverse operation of relativizeIri.

If iri is already absolute (contains a scheme like 'http:'), it's returned unchanged regardless of baseIri.

Throws BaseIriRequiredException if iri is relative but baseIri is null or empty.

Examples:

resolveIri('file.txt', 'http://example.org/path/')
// Returns: 'http://example.org/path/file.txt'

resolveIri('#section', 'http://example.org/document')
// Returns: 'http://example.org/document#section'

resolveIri('http://other.org/file', 'http://example.org/')
// Returns: 'http://other.org/file' (unchanged - already absolute)

The function uses Dart's built-in Uri.resolveUri when possible, falling back to manual resolution for edge cases.

Implementation

String resolveIri(String iri, String? baseIri) {
  if (_isAbsoluteUri(iri)) {
    return iri;
  }

  if (baseIri == null || baseIri.isEmpty) {
    throw BaseIriRequiredException(relativeUri: iri);
  }

  try {
    final base = Uri.parse(baseIri);
    final resolved = base.resolveUri(Uri.parse(iri));
    return resolved.toString();
  } catch (e) {
    // Fall back to manual resolution if URI parsing fails
    return _manualResolveUri(iri, baseIri);
  }
}