run method
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();
}
}