Pudu programming language
Menu
Package

@chrismichaelps / pudu-lang-log

Structured event logging for Pudu: message templates, enrichment, filtering, formatting, and sinks

0.1.0Apache-2.01

InstallClose

SelfLog.pudu

Pudu52 lines1.5 KB

GitHub ↗
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) -> ()]] }1213/// A self-log that writes nothing until enabled.14export fn create() -> SelfLog {15  let none: Option[fn(Str) -> ()] = None16  SelfLog{writer: Sync.cell(none)}17}1819/// A self-log writing to the error stream.20export fn toErrorStream() -> SelfLog {21  let log = create()22  enable(&log, fn(line: Str) -> () { let _written = Io.writeErrorLine(line) })23  log24}2526/// Starts sending problems to a writer.27export fn enable(log: &SelfLog, writer: fn(Str) -> ()) -> () {28  let _stored = Sync.set(&log.writer, Some(writer))29}3031/// Stops sending problems anywhere.32export fn disable(log: &SelfLog) -> () {33  let none: Option[fn(Str) -> ()] = None34  let _stored = Sync.set(&log.writer, none)35}3637/// Whether a writer is set.38export fn isEnabled(log: &SelfLog) -> Bool {39  match Sync.get(&log.writer) {40    case Ok(Some(_)) => true41    case _ => false42  }43}4445/// Writes a problem, prefixed with the UTC time, when a writer is set.46export 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