Hyperlinkv0.8.0-beta.28

Layer

Layer.catchTagconsteffect/Layer.ts:1854
<
  const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>,
  E,
  RIn2,
  E2,
  ROut2
>(
  k: K,
  f: (
    e: Types.ExtractTag<
      Types.NoInfer<E>,
      K extends NonEmptyReadonlyArray<string> ? K[number] : K
    >
  ) => Layer<ROut2, E2, RIn2>
): <RIn, ROut>(
  self: Layer<ROut, E, RIn>
) => Layer<
  ROut & ROut2,
  | E2
  | Types.ExcludeTag<
      E,
      K extends NonEmptyReadonlyArray<string> ? K[number] : K
    >,
  RIn2 | RIn
>
<
  RIn,
  E,
  ROut,
  const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>,
  RIn2,
  E2,
  ROut2
>(
  self: Layer<ROut, E, RIn>,
  k: K,
  f: (
    e: Types.ExtractTag<
      E,
      K extends NonEmptyReadonlyArray<string> ? K[number] : K
    >
  ) => Layer<ROut2, E2, RIn2>
): Layer<
  ROut & ROut2,
  | E2
  | Types.ExcludeTag<
      E,
      K extends NonEmptyReadonlyArray<string> ? K[number] : K
    >,
  RIn | RIn2
>

Recovers from specific tagged errors.

When to use

Use when only some tagged Layer construction errors should be recovered.

Example (Recovering from tagged layer errors)

import { Context, Data, Effect, Layer } from "effect"

class ConfigError extends Data.TaggedError("ConfigError") {}

class Config extends Context.Service<Config, {
  readonly apiUrl: string
}>()("Config") {}

const configLayer = Layer.effect(Config, Effect.fail(new ConfigError()))

const fallbackLayer = Layer.succeed(Config, { apiUrl: "http://localhost" })

const recovered = configLayer.pipe(
  Layer.catchTag("ConfigError", () => fallbackLayer)
)
error handlingcatchCause
Source effect/Layer.ts:185450 lines
export const catchTag: {
  <const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>, E, RIn2, E2, ROut2>(
    k: K,
    f: (
      e: Types.ExtractTag<Types.NoInfer<E>, K extends NonEmptyReadonlyArray<string> ? K[number] : K>
    ) => Layer<ROut2, E2, RIn2>
  ): <RIn, ROut>(
    self: Layer<ROut, E, RIn>
  ) => Layer<
    ROut & ROut2,
    E2 | Types.ExcludeTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>,
    RIn2 | RIn
  >
  <
    RIn,
    E,
    ROut,
    const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>,
    RIn2,
    E2,
    ROut2
  >(
    self: Layer<ROut, E, RIn>,
    k: K,
    f: (e: Types.ExtractTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>) => Layer<ROut2, E2, RIn2>
  ): Layer<
    ROut & ROut2,
    E2 | Types.ExcludeTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>,
    RIn | RIn2
  >
} = dual(3, <
  RIn,
  E,
  ROut,
  const K extends Types.Tags<E> | NonEmptyReadonlyArray<Types.Tags<E>>,
  RIn2,
  E2,
  ROut2
>(
  self: Layer<ROut, E, RIn>,
  k: K,
  f: (e: Types.ExtractTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>) => Layer<ROut2, E2, RIn2>
): Layer<ROut & ROut2, E2 | Types.ExcludeTag<E, K extends NonEmptyReadonlyArray<string> ? K[number] : K>, RIn | RIn2> =>
  fromBuildUnsafe((memoMap, scope) =>
    internalEffect.catchTag(
      self.build(memoMap, scope),
      k,
      (error) => f(error).build(memoMap, scope)
    ) as any
  ))