diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d6bbeba..c7d43ff8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 3.1.0 +* Add `Router.groupAsync` + # 3.0.6 * Remove static default values for `middleware`. diff --git a/README.md b/README.md index 067f7959..881e4448 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,12 @@ main() { (r) => r.id == reviewId); }); }, middleware: [put, middleware, here]); + + // Grouping can also take async callbacks. + await router.groupAsync('/hello', (router) async { + var name = await getNameFromFileSystem(); + router.get(name, (req, res) => '...'); + }); } ``` diff --git a/lib/src/router.dart b/lib/src/router.dart index 0efb89f0..9d6e4f1c 100644 --- a/lib/src/router.dart +++ b/lib/src/router.dart @@ -1,18 +1,15 @@ library angel_route.src.router; +import 'dart:async'; import 'package:combinator/combinator.dart'; import 'package:meta/meta.dart'; import 'package:string_scanner/string_scanner.dart'; import '../string_util.dart'; import 'routing_exception.dart'; - part 'grammar.dart'; - part 'route.dart'; - part 'routing_result.dart'; - part 'symlink_route.dart'; //final RegExp _param = RegExp(r':([A-Za-z0-9_]+)(\((.+)\))?'); @@ -175,6 +172,16 @@ class Router { return mount(path, router)..name = name; } + /// Asynchronous equivalent of [group]. + Future> groupAsync( + String path, FutureOr callback(Router router), + {Iterable middleware, String name}) async { + middleware ??= []; + final router = Router().._middleware.addAll(middleware); + await callback(router); + return mount(path, router)..name = name; + } + /// Generates a URI string based on the given input. /// Handy when you have named routes. /// @@ -425,6 +432,16 @@ class _ChainedRouter extends Router { return mount(path, router)..name = name; } + @override + Future> groupAsync( + String path, FutureOr callback(Router router), + {Iterable middleware, String name}) async { + final router = _ChainedRouter( + _root, []..addAll(_handlers)..addAll(middleware ?? [])); + await callback(router); + return mount(path, router)..name = name; + } + @override SymlinkRoute mount(String path, Router router) { final route = super.mount(path, router); diff --git a/pubspec.yaml b/pubspec.yaml index f2d0a3ae..4c243b8e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: angel_route description: A powerful, isomorphic routing library for Dart. It is mainly used in the Angel framework, but can be used in Flutter and on the Web. -version: 3.0.6 +version: 3.1.0 author: Tobe O homepage: https://github.com/angel-dart/angel_route environment: