
Diagnostic.pudu
Pudu52 lines1.9 KB
1/** @Log.Web.Diagnostic.Collector — properties gathered while a request runs */2module PuduLangLog.Web.Diagnostic34import Std.Sync as Sync5import PuduLangLog as Log67/** @Log.Web.Diagnostic.Entry — a value set by a handler and how to capture it */8export type Entry = { name: Str, value: Log.Value, destructure: Bool }910/** @Log.Web.Diagnostic.Collector — what a handler added to its request's completion event */11export type Collector = { entries: Sync.Cell[Array[Entry]], failure: Sync.Cell[Option[Log.Failure]] }121314export fn create() -> Collector {15 let none: Array[Entry] = []16 let noFailure: Option[Log.Failure] = None17 Collector{entries: Sync.cell(none), failure: Sync.cell(noFailure)}18}192021export fn set(collector: &Collector, name: Str, held: Log.Value) -> () { store(collector, Entry{name: name, value: held, destructure: false}) }222324export fn setDestructured(collector: &Collector, name: Str, held: Log.Value) -> () { store(collector, Entry{name: name, value: held, destructure: true}) }252627fn store(collector: &Collector, entry: Entry) -> () {28 let current = entries(collector).filter(|existing: Entry| existing.name != entry.name)29 let _stored = Sync.set(&collector.entries, current.push(entry))30}313233export fn setFailure(collector: &Collector, problem: Log.Failure) -> () {34 let _stored = Sync.set(&collector.failure, Some(problem))35}363738export fn entries(collector: &Collector) -> Array[Entry] {39 match Sync.get(&collector.entries) {40 case Ok(held) => held41 case Err(_) => []42 }43}444546export fn failure(collector: &Collector) -> Option[Log.Failure] {47 match Sync.get(&collector.failure) {48 case Ok(held) => held49 case Err(_) => None50 }51}52