run method

Future<TaskResult<T>> run()

Implementation

Future<TaskResult<T>> run() async {
  if (_status != TaskStatus.pending && _status != TaskStatus.queued) {
    return _result ?? TaskCancelled<T>('Task already executed');
  }

  _status = TaskStatus.running;
  _startTime = DateTime.now();
  _completer = Completer<TaskResult<T>>();
  log.info('Task started: $name');

  if (timeout != null) {
    _timeoutTimer = Timer(timeout!, () {
      if (!_completer!.isCompleted) {
        _status = TaskStatus.timedOut;
        _endTime = DateTime.now();
        _result = TaskCancelled<T>('Task timed out after $timeout');
        log.error('Task timed out after $timeout');
        _completer!.complete(_result!);
      }
    });
  }

  try {
    final value = await _function((p) {
      _progress = p;
      return p;
    });

    if (_cancelRequested) {
      _status = TaskStatus.cancelled;
      _result = const TaskCancelled();
      log.info('Task cancelled');
    } else if (!_completer!.isCompleted) {
      _status = TaskStatus.completed;
      _result = TaskSuccess<T>(value);
      log.info('Task completed successfully');
    }
  } catch (e, st) {
    if (!_completer!.isCompleted) {
      _status = TaskStatus.failed;
      _result = TaskFailure<T>(e, st);
      log.error('Task failed: $e');
    }
  } finally {
    _endTime = DateTime.now();
    _timeoutTimer?.cancel();
    if (!_completer!.isCompleted) {
      _completer!.complete(_result!);
    }
  }

  return _result!;
}