
Memory.pudu
Pudu65 lines2.2 KB
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 }121314export fn create() -> Memory { bounded(2147483647) }151617export fn bounded(capacity: Int) -> Memory {18 let none: Array[Log.Event] = []19 Memory{events: Sync.cell(none), lock: Sync.mutex(), capacity: capacity}20}212223export 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}333435export fn events(memory: &Memory) -> Array[Log.Event] {36 match Sync.get(&memory.events) {37 case Ok(held) => held38 case Err(_) => []39 }40}414243export fn messages(memory: &Memory) -> Array[Str] {44 events(memory).map(|event: Log.Event| Display.plain(&Display.message(&event.template, &event.properties, &None)))45}464748export fn matching(memory: &Memory, predicate: fn(&Log.Event) -> Bool) -> Array[Log.Event] {49 events(memory).filter(|event: Log.Event| predicate(&event))50}515253export fn withTemplate(memory: &Memory, template: Str) -> Array[Log.Event] {54 events(memory).filter(|event: Log.Event| event.template.text == template)55}565758export fn latest(memory: &Memory) -> Option[Log.Event] { List.last(&events(memory)) }596061export 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