LemonCore.Events.CronRunStarted (lemon_core v0.1.0)

View Source

A cron job (or timer heartbeat) began executing. Published on cron.

Fields are flat rather than nesting the job and run records: consumers only ever read these, and the nested form is what let two emitters drift apart before Phase 3.1.

Summary

Functions

The LemonCore.Event type atom this payload is published under.

Payload version. Bumped only for a breaking field change (see the semver table in docs/platform/bus-events.md §4.3).

The struct's field names, in declaration order.

Build the payload from a map that may be a legacy free-form payload.

Build the payload, raising on unknown or missing keys.

Types

t()

@type t() :: %LemonCore.Events.CronRunStarted{
  agent_id: String.t() | nil,
  cron_run_id: String.t(),
  job_id: String.t(),
  job_name: String.t() | nil,
  router_run_id: String.t() | nil,
  run: map() | nil,
  session_key: String.t() | nil,
  started_at_ms: non_neg_integer() | nil,
  triggered_by: atom()
}

Functions

event_type()

@spec event_type() :: atom()

The LemonCore.Event type atom this payload is published under.

event_version()

@spec event_version() :: pos_integer()

Payload version. Bumped only for a breaking field change (see the semver table in docs/platform/bus-events.md §4.3).

fields()

@spec fields() :: [atom()]

The struct's field names, in declaration order.

from_map(payload)

@spec from_map(map() | struct() | keyword()) :: struct()

Build the payload from a map that may be a legacy free-form payload.

Unknown keys are dropped and string keys are accepted, so a consumer can coerce whatever arrives on the topic. Enforced keys are still required — a map missing them is not a valid payload under any version.

new(payload)

@spec new(map() | keyword()) :: struct()

Build the payload, raising on unknown or missing keys.

This is the publisher-side constructor: a typo should fail at the point of publish, not silently produce a payload with a nil field that a consumer reads as absent.