parseInternalUri method

SplitRoutePath parseInternalUri(
  1. Uri uri
)

Implementation

SplitRoutePath parseInternalUri(Uri uri) {
  print("[SplitRouteInformationParser] parseInternalUri: ${uri.path}");
  List<PageInstance> instances = <PageInstance>[];

  if (uri.pathSegments.length == 0) {
    instances.add(pageCollectionMap.pageHome.withoutParam());
  } else {
    var segmentsLeft = <String>[]..addAll(uri.pathSegments);

    while (segmentsLeft.length != 0) {
      var key = segmentsLeft[0];
      var isAnonymousPage = key.length == 5 &&
          (int.tryParse(key)?.toString() ?? "x").padLeft(5, "0") == key;

      if (isAnonymousPage) {
        var currentVersion = SplitRouterDelegate
            .instance.routePath.pageInstances
            .where((p) => p is AnonymousPage)
            .cast<AnonymousPage?>()
            .firstWhere((p) => p!.keyNumber == key, orElse: () => null);
        if (currentVersion != null) {
          instances.add(currentVersion);
        }
        segmentsLeft = segmentsLeft.sublist(1);
      } else {
        if (pageCollectionMap.containsKey(segmentsLeft[0])) {
          var keyPage = pageCollectionMap[key];
          segmentsLeft = segmentsLeft.sublist(1);
          if (segmentsLeft.length >= keyPage.parameterCount) {
            var params = segmentsLeft.sublist(0, keyPage.parameterCount);

            var currentVersion = SplitRouterDelegate
                .instance.routePath.pageInstances
                .where((p) => p is KeyPageInstance)
                .cast<KeyPageInstance?>()
                .firstWhere(
                    (p) =>
                        p!.keyPage.key == key &&
                        p.param.join("/") == params.join("/"),
                    orElse: () => null);

            if (currentVersion != null) {
              instances.add(currentVersion);
            } else {
              instances.add(keyPage.withParam(params));
            }

            segmentsLeft = segmentsLeft.sublist(keyPage.parameterCount);
          } else {
            return SplitRoutePath([pageCollectionMap.page404.withoutParam()]);
          }
        } else {
          return SplitRoutePath([pageCollectionMap.page404.withoutParam()]);
        }
      }
    }
  }

  return SplitRoutePath(instances);
}