run<T extends Object> static method

Future<Result<T>> run<T extends Object>(
  1. String operation,
  2. Future<Result<T>> action()
)

Implementation

static Future<Result<T>> run<T extends Object>(
  String operation,
  Future<Result<T>> Function() action,
) async {
  final context = NativeCallContext._();
  try {
    final result = await runZoned(action, zoneValues: {_key: context});
    final pending = context.failure;
    if (pending != null) {
      final primary = result.exceptionOrNull();
      if (primary is OdbcError && !identical(primary, pending)) {
        return Failure(primary.withSecondary(pending));
      }
      return Failure(pending);
    }
    return result;
  } on AsyncError catch (error, stack) {
    final captured = context.failure;
    if (captured != null) {
      throw captured.withDetails(
        captured.details.copyWith(
          cause: error,
          stackTrace: stack,
        ),
      );
    }
    throw translateOdbcError(
      error,
      operation: operation,
      stackTrace: stack,
    );
  }
}