summaryrefslogtreecommitdiff
path: root/u/trace/logger.ts
diff options
context:
space:
mode:
authorElizabeth Alexander Hunt <me@liz.coffee>2025-05-18 12:24:09 -0700
committerElizabeth Alexander Hunt <me@liz.coffee>2025-05-18 12:24:09 -0700
commit9cf3fc0259730b7dcf47b3ab4a04369e39fb4614 (patch)
treea96d39b4f28d38e327376cbef7ba60dbaa95e111 /u/trace/logger.ts
parentef51b25e4388cbdf3a27e23d9f1fa381ae20a5ad (diff)
downloadci-9cf3fc0259730b7dcf47b3ab4a04369e39fb4614.tar.gz
ci-9cf3fc0259730b7dcf47b3ab4a04369e39fb4614.zip
finish up pengueno
Diffstat (limited to 'u/trace/logger.ts')
-rw-r--r--u/trace/logger.ts87
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 };
+ }
+}