run method

  1. @override
Future<int> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
Future<int> run() async {
  if (argResults!.rest.isNotEmpty) {
    usageException('index: no positional arguments are accepted');
  }
  final selected = argResults!.option('grid-home')?.trim();
  final unresolved = selected == null || selected.isEmpty
      ? _gridHomeDefault()
      : selected;
  if (!p.isAbsolute(unresolved)) {
    usageException(
      'index: --grid-home must be an ABSOLUTE path (got "$unresolved")',
    );
  }
  final home = p.normalize(unresolved);
  final provider = _registry.resolve(argResults!.option('provider'));
  final index = await _indexOpen(
    gridHome: home,
    identity: provider.indexIdentity,
  );
  final binding = _siteBindingLoad(p.join(home, kEmbeddingSiteBindingFile));
  final client = EmbeddingClient.mount(
    registry: _registry,
    providerId: provider.id,
    environment: _environment,
    indexIdentity: provider.indexIdentity,
    siteBinding: binding,
    send: _send,
  );
  final delegate = _delegate(home);
  try {
    final roster = mountedRosterOf(delegate);
    if (roster.isEmpty) {
      _err.writeln('index: resident station mounts no substations');
      return 1;
    }
    final report = await StationIndexService(
      index: index,
      client: client,
      provider: provider,
      source: _source,
      changeKeyOf: _changeKeyOf,
      dirExists: _dirExists,
    ).indexRoster(roster: roster, full: argResults!.flag('full'));
    if (argResults!.flag('json')) {
      _out.writeln(jsonEncode(report.toJson()));
    } else {
      for (final outcome in report.stores) {
        switch (outcome) {
          case StoreIndexed(
            :final store,
            :final embedded,
            :final skippedFresh,
            :final removed,
          ):
            _out.writeln(
              '${store.name}: embedded=$embedded '
              'skipped-fresh=$skippedFresh removed=$removed',
            );
          case IndexStoreAbsent(:final store, :final reason):
            _out.writeln('${store.name}: absent — $reason');
          case IndexStoreFailed(:final store, :final reason):
            _err.writeln('${store.name}: FAILED — $reason');
        }
      }
    }
    return report.succeeded ? 0 : 1;
  } finally {
    delegate.dispose();
  }
}