import { isMetricsTraceSupplier, type ITrace, type ITraceWith, LogTrace, type LogTraceSupplier, MetricsTrace, type MetricsTraceSupplier, type MetricValue, TraceableImpl, } from "@emprespresso/pengueno"; export class LogTraceable extends TraceableImpl { public static LogTrace = new LogTrace(); static from(t: T) { return new LogTraceable(t, LogTraceable.LogTrace); } } const getEmbeddedMetricConsumer = (logTrace: LogTrace) => (metrics: Array) => logTrace.addTrace("").trace( JSON.stringify(metrics, null, 2) + "", ); export class EmbeddedMetricsTraceable extends TraceableImpl { public static MetricsTrace = new MetricsTrace( getEmbeddedMetricConsumer(LogTraceable.LogTrace), ); static from(t: T) { return new EmbeddedMetricsTraceable( t, EmbeddedMetricsTraceable.MetricsTrace, ); } } export type LogMetricTraceSupplier = ITraceWith< LogTraceSupplier | MetricsTraceSupplier >; export class LogMetricTrace implements ITrace { constructor( private logTrace: ITrace, private metricsTrace: ITrace, ) {} public addTrace( trace: LogTraceSupplier | MetricsTraceSupplier, ): LogMetricTrace { if (isMetricsTraceSupplier(trace)) { this.metricsTrace = this.metricsTrace.addTrace(trace); return this; } this.logTrace = this.logTrace.addTrace(trace); return this; } public trace(trace: LogTraceSupplier | MetricsTraceSupplier) { if (isMetricsTraceSupplier(trace)) { this.metricsTrace.trace(trace); return this; } this.logTrace.trace(trace); return this; } } export class LogMetricTraceable extends TraceableImpl { public static LogMetricTrace = new LogMetricTrace( LogTraceable.LogTrace, EmbeddedMetricsTraceable.MetricsTrace, ); static from(t: T) { return new LogMetricTraceable( t, LogMetricTraceable.LogMetricTrace, ); } }