Hyperlinkv0.8.0-beta.28

ConfigProvider

ConfigProvider.nestedconsteffect/ConfigProvider.ts:579
(prefix: string | Path): (self: ConfigProvider) => ConfigProvider
(self: ConfigProvider, prefix: string | Path): ConfigProvider

Scopes a provider so that all lookups are prefixed with the given path segments.

When to use

Use to namespace config under a prefix like "app" or "database", or reuse the same provider shape for multiple sub-configs.

Details

Accepts a single string or a full Path array. For providers composed with orElse, the prefix is applied to each operand. Supports both data-last and data-first calling conventions.

Gotchas

Ordering matters when composing with mapInput or constantCase. Later provider transformations run after earlier ones: a later nested becomes the outer prefix, and a later mapInput sees the whole path produced by previous transformations.

Example (Nesting under a prefix)

import { ConfigProvider } from "effect"

const provider = ConfigProvider.fromEnv({
  env: { APP_HOST: "localhost", APP_PORT: "3000" }
})

// Lookups for ["HOST"] now resolve to ["APP", "HOST"]
const scoped = ConfigProvider.nested(provider, "APP")
export const nested: {
  (prefix: string | Path): (self: ConfigProvider) => ConfigProvider
  (self: ConfigProvider, prefix: string | Path): ConfigProvider
} = dual(
  2,
  (self: ConfigProvider, prefix: string | Path): ConfigProvider => {
    const path = typeof prefix === "string" ? [prefix] : prefix
    const state = self.state
    switch (state._tag) {
      case "Source":
        return makeSource(state.get, flow(state.transform, (input) => [...path, ...input]))
      case "OrElse":
        return makeOrElse(nested(state.first, path), nested(state.second, path))
    }
  }
)