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 {
final path = argResults!['path'] as String;
final outputPath = argResults!['output'] as String?;
final limitStr = argResults!['limit'] as String?;
final verbose = argResults!['verbose'] as bool;
final limit = limitStr != null ? int.tryParse(limitStr) : null;
if (limitStr != null && limit == null) {
stderr.writeln('Error: Invalid limit value: $limitStr');
return 2;
}
final result = OperationResult();
final outputToStdout = outputPath == null;
try {
final firestorePath = PathValidator.validatePath(path);
if (!outputToStdout) {
stdout.writeln('Connecting to Firestore...');
}
final client = await FirestoreClient.fromEnvironment();
if (!outputToStdout) {
stdout.writeln(
'Exporting ${firestorePath.isCollection ? 'collection' : 'document'}: $path',
);
}
dynamic exportData;
if (firestorePath.isCollection) {
exportData = await _exportCollection(
client: client,
collectionPath: firestorePath,
limit: limit,
result: result,
verbose: verbose && !outputToStdout,
outputToStdout: outputToStdout,
);
} else {
exportData = await _exportDocument(
client: client,
documentPath: firestorePath,
result: result,
);
}
const encoder = JsonEncoder.withIndent(' ');
final jsonString = encoder.convert(exportData);
if (outputToStdout) {
stdout.write(jsonString);
if (!jsonString.endsWith('\n')) {
stdout.writeln();
}
} else {
stdout.writeln('Writing to $outputPath...');
final file = File(outputPath);
await file.writeAsString(jsonString);
result
..bytesWritten = jsonString.length
..printSummary(verbose: verbose);
}
return result.hasErrors ? 1 : 0;
} on Exception catch (e) {
stderr.writeln('Error: $e');
return 2;
}
}