UrlPattern class
URL template with placeholders that can be filled in to produce a URL.
class UrlPattern { final List<_UrlPatternToken> _tokens; /** * Creates a UrlPattern from the specification [:pattern:]. * See http://tools.ietf.org/html/draft-gregorio-uritemplate-07 * We only implement a very simple subset for now. */ UrlPattern(String pattern) : _tokens = [] { var cursor = 0; while (cursor < pattern.length) { final open = pattern.indexOf("{", cursor); if (open < 0) { final rest = pattern.substring(cursor); _tokens.add((params) => rest); cursor = pattern.length; } else { if (open > cursor) { final intermediate = pattern.substring(cursor, open); _tokens.add((params) => intermediate); } final close = pattern.indexOf("}", open); if (close < 0) throw new ArgumentError("Token meets end of text: $pattern"); String variable = pattern.substring(open + 1, close); _tokens.add((params) => (params[variable] == null) ? 'null' : Uri.encodeComponent(params[variable].toString())); cursor = close + 1; } } } /** Generate a URL with the specified list of URL and query parameters. */ String generate(Map<String, Object> urlParams, Map<String, Object> queryParams) { final buffer = new StringBuffer(); _tokens.forEach((token) => buffer.write(token(urlParams))); var first = true; queryParams.forEach((key, value) { if (value == null) return; if (value is List) { value.forEach((listValue) { buffer.write(first ? '?' : '&'); if (first) first = false; buffer.write(Uri.encodeComponent(key.toString())); buffer.write('='); buffer.write(Uri.encodeComponent(listValue.toString())); }); } else { buffer.write(first ? '?' : '&'); if (first) first = false; buffer.write(Uri.encodeComponent(key.toString())); buffer.write('='); buffer.write(Uri.encodeComponent(value.toString())); } }); return buffer.toString(); } static String generatePattern(String pattern, Map<String, Object> urlParams, Map<String, Object> queryParams) { var urlPattern = new UrlPattern(pattern); return urlPattern.generate(urlParams, queryParams); } }
Static Methods
String generatePattern(String pattern, Map<String, Object> urlParams, Map<String, Object> queryParams) #
static String generatePattern(String pattern, Map<String, Object> urlParams, Map<String, Object> queryParams) { var urlPattern = new UrlPattern(pattern); return urlPattern.generate(urlParams, queryParams); }
Constructors
new UrlPattern(String pattern) #
Creates a UrlPattern from the specification pattern
.
See http://tools.ietf.org/html/draft-gregorio-uritemplate-07
We only implement a very simple subset for now.
UrlPattern(String pattern) : _tokens = [] { var cursor = 0; while (cursor < pattern.length) { final open = pattern.indexOf("{", cursor); if (open < 0) { final rest = pattern.substring(cursor); _tokens.add((params) => rest); cursor = pattern.length; } else { if (open > cursor) { final intermediate = pattern.substring(cursor, open); _tokens.add((params) => intermediate); } final close = pattern.indexOf("}", open); if (close < 0) throw new ArgumentError("Token meets end of text: $pattern"); String variable = pattern.substring(open + 1, close); _tokens.add((params) => (params[variable] == null) ? 'null' : Uri.encodeComponent(params[variable].toString())); cursor = close + 1; } } }
Methods
String generate(Map<String, Object> urlParams, Map<String, Object> queryParams) #
Generate a URL with the specified list of URL and query parameters.
String generate(Map<String, Object> urlParams, Map<String, Object> queryParams) { final buffer = new StringBuffer(); _tokens.forEach((token) => buffer.write(token(urlParams))); var first = true; queryParams.forEach((key, value) { if (value == null) return; if (value is List) { value.forEach((listValue) { buffer.write(first ? '?' : '&'); if (first) first = false; buffer.write(Uri.encodeComponent(key.toString())); buffer.write('='); buffer.write(Uri.encodeComponent(listValue.toString())); }); } else { buffer.write(first ? '?' : '&'); if (first) first = false; buffer.write(Uri.encodeComponent(key.toString())); buffer.write('='); buffer.write(Uri.encodeComponent(value.toString())); } }); return buffer.toString(); }