1/** @Log.Enricher.Stage — adds properties to events as they pass */2modulePuduLangLog.Enricher34importPuduLangLog.Domain.CaptureasCapture5importPuduLangLog.Domain.LevelsasLevels6importPuduLangLog.Domain.PropertiesasProperties7importPuduLangLog.LevelSwitchasLevelSwitch8importPuduLangLogasLog910/** @Log.Enricher.Function — an event in, the enriched event out */11exporttypeEnricher = fn(Log.Event, &Capture.Policy) -> Log.Event1213/// Adds a property unless the event already has one of that name; structures render to text.14exportfnproperty(name: Str, held: Log.Value) -> Enricher { captured(name, held, Log.Default) }1516/// Adds a property unless the event already has one of that name, keeping structures.17exportfndestructured(name: Str, held: Log.Value) -> Enricher { captured(name, held, Log.Destructure) }1819/// Adds a property captured under a hint unless the event already has one of that name.20fncaptured(name: Str, held: Log.Value, hint: Log.Hint) -> Enricher {21fn(event: Log.Event, policy: &Capture.Policy) -> Log.Event {22ifProperties.has(&event.properties, name) { return event }23Log.Event{..event, properties: event.properties.push(Log.Property{name: name, value: Capture.capture(policy, &held, hint)})}24 }25}2627/// Adds a property computed from the event unless the event already has one of that name, keeping28/// structures when `destructure` is set.29exportfncomputed(name: Str, compute: fn(&Log.Event) -> Log.Value, destructure: Bool) -> Enricher {30let hint = if destructure { Log.Destructure } else { Log.Default }31fn(event: Log.Event, policy: &Capture.Policy) -> Log.Event {32ifProperties.has(&event.properties, name) { return event }33let held = compute(&event)34Log.Event{..event, properties: event.properties.push(Log.Property{name: name, value: Capture.capture(policy, &held, hint)})}35 }36}3738/// An enricher from a function over events.39exportfnfrom(change: fn(Log.Event) -> Log.Event) -> Enricher {40fn(event: Log.Event, _policy: &Capture.Policy) -> Log.Event { change(event) }41}4243/// Applies an enricher only to events the condition accepts.44exportfnwhen(condition: fn(&Log.Event) -> Bool, enricher: Enricher) -> Enricher {45fn(event: Log.Event, policy: &Capture.Policy) -> Log.Event { if condition(&event) { enricher(event, policy) } else { event } }46}4748/// Applies an enricher only to events at or above a level.49exportfnatLevel(minimum: Log.Level, enricher: Enricher) -> Enricher {50 when(fn(event: &Log.Event) -> Bool { Levels.passes(event.level, minimum) }, enricher)51}5253/// Applies an enricher only to events a level switch allows.54exportfnatSwitch(control: &LevelSwitch.LevelSwitch, enricher: Enricher) -> Enricher {55let shared = *control56 when(fn(event: &Log.Event) -> Bool { LevelSwitch.allows(&shared, event.level) }, enricher)57}5859/// Applies enrichers in order.60exportfnall(enrichers: Array[Enricher]) -> Enricher {61fn(event: Log.Event, policy: &Capture.Policy) -> Log.Event {62var current = event63for enricher in enrichers { current = enricher(current, policy) }64 current65 }66}67