buildDocuments function

Future<List<RouteDocument>> buildDocuments(
  1. RouteMatches matches,
  2. Map<Object, RouteLoadResult> loads, {
  3. required AppContext app,
})

Builds document fragments for a fully loaded route branch.

Implementation

Future<List<RouteDocument>> buildDocuments(
  RouteMatches matches,
  Map<Object, RouteLoadResult> loads, {
  required AppContext app,
}) async {
  final entries = <_DocumentEntry>[];
  for (final route in matches.routes) {
    final load = loads[route.identity];
    if (load == null) {
      throw StateError('Missing loader result for route ${route.path}.');
    }
    if (load.isLoaded && !load.hasData) {
      Error.throwWithStackTrace(load.error!, load.stackTrace!);
    }
    final values = matches.branch.values(route)!;
    entries.add(
      _DocumentEntry(
        route: route,
        params: values.params,
        search: values.search,
        data: load.isLoaded ? load.data : const NoData(),
      ),
    );
  }
  final branch = DocumentBranch._(entries);
  final documents = <RouteDocument>[];
  for (final route in matches.routes) {
    final binding = route.capability(_documentCapability);
    final built = binding == null
        ? null
        : await binding.build(
            app,
            route,
            matches,
            loads[route.identity]!.isLoaded
                ? loads[route.identity]!.data
                : const NoData(),
            branch,
          );
    final document = _withMetadata(route.metadata, built);
    if (document != null) documents.add(document);
  }
  return List<RouteDocument>.unmodifiable(documents);
}