url_service_router 0.1.1
url_service_router: ^0.1.1 copied to clipboard
A synchronous, pure URL resolution/dispatch kernel for Dart: URL -> serviceName + params. No navigation, no side effects, no Flutter dependency.
example/url_service_router_example.dart
import 'package:url_service_router/url_service_router.dart';
/// Worked scenario:
/// production host: www.example.com, staging host: *.example.net
/// http://beta.example.net/owner/1/info ==> look up user info for id=1
UrlRouter buildRouter() {
final router = UrlRouter();
// 1) Root node: global redirect parsers (pre; run first on descent).
router.registerRootParsers(() => [
// http -> https
FunctionParser(
type: ParserType.pre,
onParse: (request, parser) {
if (request.nodeNames.isNotEmpty &&
request.nodeNames.first == 'http') {
final names = [...request.nodeNames]..[0] = 'https';
request.replaceNodeNames(names, parser);
}
return ParserDecision.next;
},
),
// *.example.net -> www.example.com
FunctionParser(
type: ParserType.pre,
onParse: (request, parser) {
final index =
request.nodeNames.indexWhere((n) => n.endsWith('.example.net'));
if (index != -1) {
final names = [...request.nodeNames]..[index] = 'www.example.com';
request.replaceNodeNames(names, parser);
}
return ParserDecision.next;
},
),
]);
// 2) owner node: extract the numeric id from /owner/<id>/... into params.
router.registerNode(
'https://www.example.com/owner/',
parsersBuilder: () => [
FunctionParser(
type: ParserType.pre,
onParse: (request, parser) {
final first =
request.nodeNames.isEmpty ? null : request.nodeNames.first;
if (first != null && int.tryParse(first) != null) {
final names = [...request.nodeNames];
final id = names.removeAt(0);
request.mergeParams({'id': id}, parser);
request.replaceNodeNames(names, parser);
}
return ParserDecision.next;
},
),
],
);
// 3) owner/info node: hit the service (post; decided on backtrack).
router.registerNode(
'https://www.example.com/owner/info',
parsersBuilder: () => [
FunctionParser(
type: ParserType.post,
onParse: (request, parser) => ParserDecision.complete('user://info'),
),
],
);
return router;
}
void main() {
final router = buildRouter();
final result =
router.resolve('http://beta.example.net/owner/1/info?ref=push');
print('serviceName : ${result.serviceName}'); // user://info
print('params : ${result.params}'); // {ref: push, id: 1}
print('isHit : ${result.isHit}'); // true
final miss = router.resolve('https://www.example.com/unknown/path');
print('miss.isHit : ${miss.isHit}'); // false
}