url_service_router 0.1.1 copy "url_service_router: ^0.1.1" to clipboard
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
}
0
likes
160
points
6
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A synchronous, pure URL resolution/dispatch kernel for Dart: URL -> serviceName + params. No navigation, no side effects, no Flutter dependency.

Repository (GitHub)
View/report issues
Contributing

Topics

#routing #url #deep-linking

License

MIT (license)

Dependencies

meta

More

Packages that depend on url_service_router