resolveIri function
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);
}
}