@@ -12,27 +12,48 @@ import './errors/errors.dart';
1212/// Extra keys in [parameters] that do not map to [pathOrTemplate] are
1313/// always used as query parameters.
1414///
15- /// If [pathOrTemplate] is template (contains `:` ) and no [parameters] are
15+ /// If [pathOrTemplate] is template (contains `:colon ` ) and no [parameters] are
1616/// provided, [UrldatError] exception will be thrown.
17- String urldat (
18- String base ,
19- String pathOrTemplate, {
20- Map <String , dynamic >? parameters,
21- }) {
17+ ///
18+ /// [scheme] option is a valid URI scheme. It's intended to be used
19+ /// with [base] URL when no scheme is present in it.
20+ /// Warning: Function will throw [UrldatError] when [base] path contains
21+ /// scheme already.
22+ ///
23+ /// [port] option is a integer describing the port number, zero or 80 are
24+ /// ignored in the final URL
25+ ///
26+ /// [fragment] option will append fragment to URL. When URL already contains
27+ /// fragment value, [UrldatError] will be thrown
28+ String urldat (String base , String pathOrTemplate,
29+ {Map <String , dynamic >? parameters,
30+ String ? scheme,
31+ int ? port,
32+ String ? fragment}) {
33+ final uri = Uri .parse (base );
34+
35+ if (hasScheme (uri) && scheme != null ) {
36+ throw UrldatError .basePathSchemeError ();
37+ }
38+
39+ if (hasFragment (pathOrTemplate) && fragment != null ) {
40+ throw UrldatError .pathFragmentError ();
41+ }
42+
43+ final parsedScheme = scheme != null ? Uri (scheme: scheme).scheme : null ;
44+
2245 final sanitizedBase = removeTrailingSlash (base );
2346 final sanitizedPathWithoutSlash =
2447 removeLeadingAndTrailingSlash (pathOrTemplate);
2548 final sanitizedPath = removeTrailingQuestionMark (sanitizedPathWithoutSlash);
2649
2750 if (isTemplate (sanitizedPath)) {
2851 if (parameters == null ) {
29- throw UrldatError (
30- 'When using path templates, you must pass parameters map.' );
52+ throw UrldatError .missingParametersWithTemplateError ();
3153 }
3254
3355 if (parameters.isEmpty) {
34- throw UrldatError (
35- 'When using path templates, you must pass non-empty parameters map.' );
56+ throw UrldatError .emptyParametersWithTemplateError ();
3657 }
3758
3859 final templateKeys = getTemplateKeys (sanitizedPath);
@@ -48,6 +69,9 @@ String urldat(
4869 base : sanitizedBase,
4970 path: filledTemplate,
5071 query: queryParameters,
72+ scheme: parsedScheme,
73+ port: port,
74+ fragment: fragment,
5175 );
5276 }
5377
@@ -57,5 +81,8 @@ String urldat(
5781 base : sanitizedBase,
5882 path: sanitizedPath,
5983 query: queryParameters,
84+ scheme: parsedScheme,
85+ port: port,
86+ fragment: fragment,
6087 );
6188}
0 commit comments