// Copyright (c) 2013, 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.

library catch_errors;

import 'dart:async';

Stream catchErrors(dynamic body()) {
  late StreamController controller;

  bool onError(e, st) {
    controller.add(e);
    return true;
  }

  void onListen() {
    runZonedGuarded(body, onError);
  }

  controller = new StreamController(onListen: onListen);
  return controller.stream;
}

runZonedScheduleMicrotask(body(),
    {void onScheduleMicrotask(void callback())?, Function? onError}) {
  if (onScheduleMicrotask == null) {
    return runZonedGuarded(body, onError as void Function(Object, StackTrace));
  }
  HandleUncaughtErrorHandler? errorHandler;
  if (onError != null) {
    errorHandler = (Zone self, ZoneDelegate parent, Zone zone, error,
        StackTrace stackTrace) {
      try {
        return self.parent!.runUnary(onError as void Function(Object), error);
      } catch (e, s) {
        if (identical(e, error)) {
          return parent.handleUncaughtError(zone, error, stackTrace);
        } else {
          return parent.handleUncaughtError(zone, e, s);
        }
      }
    };
  }
  ScheduleMicrotaskHandler? asyncHandler;
  if (onScheduleMicrotask != null) {
    asyncHandler = (Zone self, ZoneDelegate parent, Zone zone, f()) {
      self.parent!.runUnary(onScheduleMicrotask, () => zone.runGuarded(f));
    };
  }
  ZoneSpecification specification = new ZoneSpecification(
      handleUncaughtError: errorHandler, scheduleMicrotask: asyncHandler);
  Zone zone = Zone.current.fork(specification: specification);
  if (onError != null) {
    return zone.runGuarded(body);
  } else {
    return zone.run(body);
  }
}
