diff options
author | Elizabeth Alexander Hunt <me@liz.coffee> | 2025-05-18 12:24:09 -0700 |
---|---|---|
committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2025-05-18 12:24:09 -0700 |
commit | 9cf3fc0259730b7dcf47b3ab4a04369e39fb4614 (patch) | |
tree | a96d39b4f28d38e327376cbef7ba60dbaa95e111 /u/trace/logger.ts | |
parent | ef51b25e4388cbdf3a27e23d9f1fa381ae20a5ad (diff) | |
download | ci-9cf3fc0259730b7dcf47b3ab4a04369e39fb4614.tar.gz ci-9cf3fc0259730b7dcf47b3ab4a04369e39fb4614.zip |
finish up pengueno
Diffstat (limited to 'u/trace/logger.ts')
-rw-r--r-- | u/trace/logger.ts | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/u/trace/logger.ts b/u/trace/logger.ts index 4f3c856..a5739c8 100644 --- a/u/trace/logger.ts +++ b/u/trace/logger.ts @@ -1,6 +1,7 @@ import { isDebug, type ITrace, + type ITraceWith, type SideEffect, type Supplier, } from "@emprespresso/pengueno"; @@ -53,47 +54,55 @@ export const logWithLevel = ( } }; +export type LogTraceSupplier = ITraceWith<Supplier<string>>; + +const defaultTrace = () => `[${new Date().toISOString()}]`; export const LoggerImpl = console; +export class LogTrace implements ITrace<LogTraceSupplier> { + constructor( + private readonly logger: ILogger = LoggerImpl, + private readonly traces: Array<LogTraceSupplier> = [defaultTrace], + private readonly allowedLevels: Supplier<Array<LogLevel>> = + defaultAllowedLevels, + private readonly defaultLevel: LogLevel = LogLevel.INFO, + ) { + } -export type LogTraceSupplier = string | Supplier<string>; + public addTrace(trace: LogTraceSupplier): ITrace<LogTraceSupplier> { + return new LogTrace( + this.logger, + this.traces.concat(trace), + this.allowedLevels, + this.defaultLevel, + ); + } -const foldTraces = (traces: Array<LogTraceSupplier>) => { - const { line, level } = traces.reduce( - (acc: { line: string; level: number }, t) => { - const val = typeof t === "function" ? t() : t; - if (isLogLevel(val)) { - return { - ...acc, - level: Math.max(logLevelOrder.indexOf(val), acc.level), - }; - } - const prefix = [ - acc.line, - val, - ].join(" "); - return { ...acc, prefix }; - }, - { line: "", level: -1 }, - ); - return { line, level: logLevelOrder[level] ?? LogLevel.UNKNOWN }; -}; + public trace(trace: LogTraceSupplier) { + const { line, level: _level } = this.foldTraces(this.traces.concat(trace)); + if (!this.allowedLevels().includes(_level)) return; -const defaultTrace = () => `[${new Date().toISOString()}]`; -export const LogTrace = ( - logger: ILogger, - traces: Array<LogTraceSupplier> = [defaultTrace], - allowedLevels: Supplier<Array<LogLevel>> = defaultAllowedLevels, - defaultLevel: LogLevel = LogLevel.INFO, -): ITrace<LogTraceSupplier> => { - return { - addTrace: (trace: LogTraceSupplier) => - LogTrace(logger, traces.concat(trace), allowedLevels, defaultLevel), - trace: (trace: LogTraceSupplier) => { - const { line, level: _level } = foldTraces(traces.concat(trace)); - if (!allowedLevels().includes(_level)) return; + const level = _level === LogLevel.UNKNOWN ? this.defaultLevel : _level; + logWithLevel(this.logger, level)(`[${level}]${line}`); + } - const level = _level === LogLevel.UNKNOWN ? defaultLevel : _level; - logWithLevel(logger, level)(`[${level}]${line}`); - }, - }; -}; + private foldTraces(traces: Array<LogTraceSupplier>) { + const { line, level } = traces.reduce( + (acc: { line: string; level: number }, t) => { + const val = typeof t === "function" ? t() : t; + if (isLogLevel(val)) { + return { + ...acc, + level: Math.max(logLevelOrder.indexOf(val), acc.level), + }; + } + const prefix = [ + acc.line, + val, + ].join(" "); + return { ...acc, prefix }; + }, + { line: "", level: -1 }, + ); + return { line, level: logLevelOrder[level] ?? LogLevel.UNKNOWN }; + } +} |