import { IObservable, IDestroyable, ICancellation } from "../../interfaces"; import { TraceEvent, LogLevel, WarnLevel, DebugLevel } from "../TraceSource"; import { Cancellation } from "../../Cancellation"; import { destroy, argumentNotNull } from "../../safe"; import { ConsoleWriter } from "../ConsoleWriter"; export class ConsoleLogger implements IDestroyable { private readonly _subscriptions = new Array(); private readonly _writer: ConsoleWriter; constructor(writer = ConsoleWriter.default) { argumentNotNull(writer, "writer"); this._writer = writer; } writeEvents(source: IObservable, ct: ICancellation = Cancellation.none) { const subscription = source.on(this.writeEvent.bind(this)); if (ct.isSupported()) { ct.register(subscription.destroy.bind(subscription)); } this._subscriptions.push(subscription); } writeEvent(next: TraceEvent) { if (next.level >= DebugLevel) { this._writer.setLogLevel("debug"); } else if (next.level >= LogLevel) { this._writer.setLogLevel("log"); } else if (next.level >= WarnLevel) { this._writer.setLogLevel("warn"); } else { this._writer.setLogLevel("error"); } this._writer.write("{0}: ", next.source.id); if (next.args) this._writer.writeLine(next.message, ...next.args); else this._writer.writeLine(next.message); } destroy() { this._subscriptions.forEach(destroy); } }