/* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-explicit-any */ import * as Effect from "effect/Effect" import type * as LogLevel from "effect/LogLevel" import * as Context from "../Context.js" type Levels = "info" | "debug" | "warn" | "error" export class LogLevels extends Context.Reference("LogLevels", { defaultValue: () => new Map() }) {} export const makeLog = (namespace: string, defaultLevel: Levels = "warn") => { const level = LogLevels.use((levels) => Effect.succeed(levels.get(namespace) ?? defaultLevel)) const withLogNamespace = Effect.annotateLogs({ logNamespace: namespace }) return { logWarning: (...message: ReadonlyArray) => Effect.flatMap(level, (l) => l === "info" || l === "debug" || l === "warn" ? Effect.logWarning(...message).pipe(withLogNamespace) : Effect.void), logError: (...message: ReadonlyArray) => Effect.logError(...message).pipe(withLogNamespace), logFatal: (...message: ReadonlyArray) => Effect.logFatal(...message).pipe(withLogNamespace), logInfo: (...message: ReadonlyArray) => Effect.flatMap( level, (l) => l === "info" || l === "debug" ? Effect.logInfo(...message).pipe(withLogNamespace) : Effect.void ), logDebug: (...message: ReadonlyArray) => Effect.flatMap(level, (l) => l === "debug" ? Effect.logDebug(...message).pipe(withLogNamespace) : Effect.void), // for now always log logWithLevel: (level: LogLevel.Severity, ...message: ReadonlyArray) => Effect.logWithLevel(level)(...message).pipe(withLogNamespace) } }