///|
/// A structured log event that is written field-by-field.
///
/// `Event` values are returned by logger level methods only when the log site is
/// enabled. Call `write_object_begin`, write each field, then call
/// `write_object_end` to emit the entry.
struct Event {
  logger : Logger
  entry : Entry
}

///|
/// Begin writing the structured object for this event.
pub fn Event::write_object_begin(self : Event) -> Unit {
  self.entry.fields.clear()
}

///|
/// Write one structured field.
pub fn[T : ToJson] Event::write_object_field(
  self : Event,
  key : String,
  value : T,
) -> Unit {
  self.entry.fields[key] = value.to_json()
}

///|
/// Finish and emit the event.
pub fn Event::write_object_end(self : Event) -> Unit {
  self.logger.handler.handle(self.entry) catch {
    _ => ()
  }
}