deliver method

Implementation

@override
Future<ChartExportDeliveryResult> deliver(ChartExportFile file) async {
  if (adapters.isEmpty) {
    return ChartExportDeliveryResult.failure(
      file: file,
      error: 'No delivery adapters were configured.',
      metadata: _metadata(const []),
    );
  }

  final results = <ChartExportDeliveryResult>[];
  for (var index = 0; index < adapters.length; index++) {
    final result = await _deliverWithAdapter(adapters[index], file);
    results.add(result);
    if (!result.success && stopOnFirstFailure) {
      return ChartExportDeliveryResult.failure(
        file: result.file ?? file,
        error:
            'Composite delivery failed at adapter ${index + 1}/'
            '${adapters.length}: ${result.errorText ?? 'Delivery failed.'}',
        stackTrace: result.stackTrace,
        metadata: _metadata(results),
      );
    }
  }

  final failedCount = results.where((result) => !result.success).length;
  if (failedCount > 0) {
    return ChartExportDeliveryResult.failure(
      file: file,
      error:
          'Composite delivery failed for $failedCount of '
          '${adapters.length} adapters.',
      metadata: _metadata(results),
    );
  }

  return ChartExportDeliveryResult.success(
    file,
    metadata: _metadata(results),
  );
}