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 {
  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;
  }
}