Hyperlinkv0.8.0-beta.28

ErrorReporter

ErrorReporter.layerconsteffect/ErrorReporter.ts:223
<
  const Reporters extends ReadonlyArray<
    ErrorReporter | Effect.Effect<ErrorReporter, any, any>
  >
>(
  reporters: Reporters,
  options?:
    | { readonly mergeWithExisting?: boolean | undefined }
    | undefined
): Layer.Layer<
  never,
  Reporters extends readonly [] ? never : Effect.Error<Reporters[number]>,
  Exclude<
    Reporters extends readonly []
      ? never
      : Effect.Services<Reporters[number]>,
    Scope.Scope
  >
>

Creates a Layer that registers one or more ErrorReporters.

When to use

Use to provide one or more error reporters to effects that perform error reporting.

Details

Reporters can be plain ErrorReporter values or effectful Effect<ErrorReporter> values that are resolved when the layer is built. By default the provided reporters replace any previously registered reporters. Set mergeWithExisting: true to add them alongside existing ones.

Example (Providing error reporters)

import { Effect, ErrorReporter } from "effect"

const consoleReporter = ErrorReporter.make(({ error, severity }) => {
  console.error(`[${severity}]`, error.message)
})

const metricsReporter = ErrorReporter.make(({ severity }) => {
  // increment an error counter by severity
})

// Replace all existing reporters
const ReporterLive = ErrorReporter.layer([
  consoleReporter,
  metricsReporter
])

// Add to existing reporters instead of replacing
const ReporterMerged = ErrorReporter.layer(
  [metricsReporter],
  { mergeWithExisting: true }
)

const program = Effect.fail("boom").pipe(
  Effect.withErrorReporting,
  Effect.provide(ReporterLive)
)
export const layer = <
  const Reporters extends ReadonlyArray<ErrorReporter | Effect.Effect<ErrorReporter, any, any>>
>(
  reporters: Reporters,
  options?: { readonly mergeWithExisting?: boolean | undefined } | undefined
): Layer.Layer<
  never,
  Reporters extends readonly [] ? never : Effect.Error<Reporters[number]>,
  Exclude<
    Reporters extends readonly [] ? never : Effect.Services<Reporters[number]>,
    Scope.Scope
  >
> =>
  Layer.effect(
    CurrentErrorReporters,
    Effect.withFiber(Effect.fnUntraced(function*(fiber) {
      const currentReporters = new Set(
        options?.mergeWithExisting === true ? fiber.getRef(references.CurrentErrorReporters) : []
      )
      for (const reporter of reporters) {
        currentReporters.add(Effect.isEffect(reporter) ? yield* reporter : reporter)
      }
      return currentReporters
    }))
  )