// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of "dart:async";

/// An error and a stack trace.
///
/// Used when an error and stack trace need to be handled as a single
/// value, for example when returned by [Zone.errorCallback].
final class AsyncError implements Error {
  final Object error;
  final StackTrace stackTrace;

  AsyncError(Object error, StackTrace? stackTrace)
    : error = error,
      stackTrace = stackTrace ?? defaultStackTrace(error);

  AsyncError._(this.error, this.stackTrace);

  /// A default stack trace for an error.
  ///
  /// If [error] is an [Error] and it has an [Error.stackTrace],
  /// that stack trace is returned.
  /// If not, the [StackTrace.empty] default stack trace is returned.
  static StackTrace defaultStackTrace(Object error) {
    if (error is Error) {
      var stackTrace = error.stackTrace;
      if (stackTrace != null) return stackTrace;
    }
    return StackTrace.empty;
  }

  String toString() => '$error';
}
