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

Memory.pudu

Pudu65 lines2.2 KB

GitHub ↗
1/** @Log.Sinks.Memory.Sink — keeps events in memory for inspection */2module PuduLangLog.Sinks.Memory34import Std.List as List5import Std.Sync as Sync6import PuduLangLog.Domain.Display as Display7import PuduLangLog as Log8import PuduLangLog.Sink as Sink910/** @Log.Sinks.Memory.Store — the events a memory sink has received */11export type Memory = { events: Sync.Cell[Array[Log.Event]], lock: Sync.Mutex, capacity: Int }1213/// A store keeping every event.14export fn create() -> Memory { bounded(2147483647) }1516/// A store keeping only the most recent `capacity` events.17export fn bounded(capacity: Int) -> Memory {18  let none: Array[Log.Event] = []19  Memory{events: Sync.cell(none), lock: Sync.mutex(), capacity: capacity}20}2122/// The sink that adds events to the store.23export fn sink(memory: &Memory) -> Sink.Sink {24  let store = *memory25  Sink.of(fn(event: &Log.Event) -> Result[(), Str] {26      let _added = Sync.withLock(&store.lock, fn() -> () {27          let kept = events(&store).push(*event)28          let _stored = Sync.set(&store.events, List.drop(&kept, kept.length() - store.capacity))29        })30      Ok(())31    })32}3334/// The events received, oldest first.35export fn events(memory: &Memory) -> Array[Log.Event] {36  match Sync.get(&memory.events) {37    case Ok(held) => held38    case Err(_) => []39  }40}4142/// The rendered message of every event, oldest first.43export fn messages(memory: &Memory) -> Array[Str] {44  events(memory).map(|event: Log.Event| Display.plain(&Display.message(&event.template, &event.properties, &None)))45}4647/// The events a predicate accepts.48export fn matching(memory: &Memory, predicate: fn(&Log.Event) -> Bool) -> Array[Log.Event] {49  events(memory).filter(|event: Log.Event| predicate(&event))50}5152/// The events written from a message template.53export fn withTemplate(memory: &Memory, template: Str) -> Array[Log.Event] {54  events(memory).filter(|event: Log.Event| event.template.text == template)55}5657/// The most recent event.58export fn latest(memory: &Memory) -> Option[Log.Event] { List.last(&events(memory)) }5960/// Forgets every event.61export fn clear(memory: &Memory) -> () {62  let none: Array[Log.Event] = []63  let _cleared = Sync.withLock(&memory.lock, fn() -> () { let _stored = Sync.set(&memory.events, none) })64}65