ClientServer.fromMeta constructor

ClientServer.fromMeta(
  1. RevaliContext context,
  2. MetaServer server
)

Implementation

factory ClientServer.fromMeta(RevaliContext context, MetaServer server) {
  MetaAppConfig? metaApp;
  var app = ClientApp.defaultConfig();

  if (server.apps case final apps when apps.isNotEmpty) {
    final flavor = context.flavor;
    final configuredApps = apps.where((a) => a.element != null).toList();
    final candidates = configuredApps.isNotEmpty ? configuredApps : apps;

    if (candidates.length == 1) {
      final only = candidates.first;
      if (flavor == null ||
          flavor.isEmpty ||
          only.appAnnotation.flavor == flavor) {
        app = ClientApp.fromMeta(only);
        metaApp = only;
      }
    }

    if (metaApp == null) {
      for (final e in candidates) {
        if (e.appAnnotation.flavor == context.flavor) {
          app = ClientApp.fromMeta(e);
          metaApp = e;
          break;
        }
      }
    }
  }

  final lifecycleComponents = <ClientLifecycleComponent>[];

  metaApp?.annotationsFor(
    onMatch: [
      OnMatch(
        classType: LifecycleComponent,
        package: 'revali_annotations',
        convert: (object, annotation) {
          final component = ClientLifecycleComponent.fromDartObject(
            object,
            annotation,
          );

          lifecycleComponents.add(component);
        },
      ),
      OnMatch(
        classType: LifecycleComponents,
        package: 'revali_annotations',
        convert: (object, annotation) {
          lifecycleComponents.addAll(
            ClientLifecycleComponent.fromTypeReference(object, annotation),
          );
        },
      ),
    ],
  );

  return ClientServer(
    app: app,
    controllers: server.routes
        .map((e) => ClientController.fromMeta(e, lifecycleComponents))
        .toList(),
  );
}