VesperDownloadManagerEvent.fromMap constructor

VesperDownloadManagerEvent.fromMap(
  1. Map<Object?, Object?> map
)

Implementation

factory VesperDownloadManagerEvent.fromMap(Map<Object?, Object?> map) {
  final normalized = vesperDecodeMap(map);
  final type = normalized['type'] as String?;
  final downloadId = normalized['downloadId'] as String? ?? '';

  switch (type) {
    case 'initialSnapshot':
      return VesperDownloadInitialSnapshotEvent(
        downloadId: downloadId,
        snapshot: VesperDownloadSnapshot.fromMap(
          vesperDecodeMap(normalized['snapshot']),
        ),
      );
    case 'downloadResync':
      final droppedEvents = normalized['droppedEvents'];
      if (droppedEvents is! int || droppedEvents < 0) {
        throw const FormatException(
          'downloadResync droppedEvents must be a non-negative integer.',
        );
      }
      return VesperDownloadResyncEvent(
        downloadId: downloadId,
        snapshot: _decodeAuthoritativeDownloadSnapshot(
          normalized['snapshot'],
        ),
        droppedEvents: droppedEvents,
      );
    case 'downloadError':
      final snapshot = VesperDownloadSnapshot.fromMap(
        vesperDecodeMap(normalized['snapshot']),
      );
      final error = VesperDownloadError.fromMap(
        vesperDecodeMap(normalized['error']),
      );
      return VesperDownloadErrorEvent(
        downloadId: downloadId,
        error: error,
        snapshot: snapshot,
      );
    case 'exportProgress':
      return VesperDownloadExportProgressEvent(
        downloadId: downloadId,
        taskId: (normalized['taskId'] as num?)?.toInt() ?? 0,
        ratio: (normalized['ratio'] as num?)?.toDouble() ?? 0,
      );
    case 'taskCreated':
      return VesperDownloadTaskCreatedEvent(
        downloadId: downloadId,
        task: VesperDownloadTaskSnapshot.fromMap(
          vesperDecodeMap(normalized['task']),
        ),
      );
    case 'taskUpdated':
      final rawTask = normalized['task'];
      final rawPatch = normalized['patch'];
      return VesperDownloadTaskUpdatedEvent(
        downloadId: downloadId,
        task: rawTask == null
            ? null
            : VesperDownloadTaskSnapshot.fromMap(vesperDecodeMap(rawTask)),
        patch: rawPatch == null
            ? null
            : VesperDownloadTaskStatePatch.fromMap(
                vesperDecodeMap(rawPatch),
              ),
        progressPatch: normalized['progressPatch'] == null
            ? null
            : VesperDownloadTaskProgressPatch.fromMap(
                vesperDecodeMap(normalized['progressPatch']),
              ),
      );
    case 'taskRemoved':
      return VesperDownloadTaskRemovedEvent(
        downloadId: downloadId,
        taskId: (normalized['taskId'] as num?)?.toInt() ?? 0,
      );
    case 'disposed':
      return VesperDownloadDisposedEvent(downloadId: downloadId);
    default:
      return VesperDownloadUnknownEvent(
        downloadId: downloadId,
        type: type ?? '<missing>',
        payload: vesperDecodeMap(normalized),
      );
  }
}