
SelfLog.pudu
Pudu52 lines1.5 KB
1/** @Log.SelfLog.Diagnostics — reports problems inside the logging pipeline */2module PuduLangLog.SelfLog34import Std.Io as Io5import Std.Sync as Sync6import Std.Time as Time7import PuduLangLog.Domain.Dates as Dates8import PuduLangLog as Log910/** @Log.SelfLog.Channel — an optional writer for pipeline problems */11export type SelfLog = { writer: Sync.Cell[Option[fn(Str) -> ()]] }121314export fn create() -> SelfLog {15 let none: Option[fn(Str) -> ()] = None16 SelfLog{writer: Sync.cell(none)}17}181920export fn toErrorStream() -> SelfLog {21 let log = create()22 enable(&log, fn(line: Str) -> () { let _written = Io.writeErrorLine(line) })23 log24}252627export fn enable(log: &SelfLog, writer: fn(Str) -> ()) -> () {28 let _stored = Sync.set(&log.writer, Some(writer))29}303132export fn disable(log: &SelfLog) -> () {33 let none: Option[fn(Str) -> ()] = None34 let _stored = Sync.set(&log.writer, none)35}363738export fn isEnabled(log: &SelfLog) -> Bool {39 match Sync.get(&log.writer) {40 case Ok(Some(_)) => true41 case _ => false42 }43}444546export fn write(log: &SelfLog, message: Str) -> () {47 if let Ok(Some(writer)) = Sync.get(&log.writer) {48 let stamp = Dates.roundTrip(&Log.Timestamp{millis: Time.toMillis(&Time.currentInstant()), offset: 0})49 writer(stamp + " " + message)50 }51}52