-module(automata@event).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/automata/event.gleam").
-export([new/4, with_metadata/2, with_correlation_id/2, with_causation_id/2, with_trace_id/2, with_attribute/3, continue_from/5]).
-export_type([event/1]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type event(EKD) :: {event,
binary(),
automata@schedule@ast:valid_date_time(),
automata@event@source:source(),
EKD,
automata@event@metadata:metadata()}.
-file("src/automata/event.gleam", 26).
?DOC(
" Construct an event with empty metadata.\n"
"\n"
" The caller supplies `id`. The library does not generate identifiers;\n"
" pick a strategy (UUIDv7 / ULID / monotonic counter) that fits your\n"
" transport.\n"
).
-spec new(
binary(),
automata@schedule@ast:valid_date_time(),
automata@event@source:source(),
EKE
) -> event(EKE).
new(Id, Occurred_at, Source, Body) ->
{event, Id, Occurred_at, Source, Body, automata@event@metadata:empty()}.
-file("src/automata/event.gleam", 41).
-spec with_metadata(event(EKG), automata@event@metadata:metadata()) -> event(EKG).
with_metadata(Event, Meta) ->
{event,
erlang:element(2, Event),
erlang:element(3, Event),
erlang:element(4, Event),
erlang:element(5, Event),
Meta}.
-file("src/automata/event.gleam", 48).
-spec with_correlation_id(event(EKJ), binary()) -> event(EKJ).
with_correlation_id(Event, Id) ->
{event,
erlang:element(2, Event),
erlang:element(3, Event),
erlang:element(4, Event),
erlang:element(5, Event),
automata@event@metadata:with_correlation_id(
erlang:element(6, Event),
Id
)}.
-file("src/automata/event.gleam", 55).
-spec with_causation_id(event(EKM), binary()) -> event(EKM).
with_causation_id(Event, Id) ->
{event,
erlang:element(2, Event),
erlang:element(3, Event),
erlang:element(4, Event),
erlang:element(5, Event),
automata@event@metadata:with_causation_id(erlang:element(6, Event), Id)}.
-file("src/automata/event.gleam", 59).
-spec with_trace_id(event(EKP), binary()) -> event(EKP).
with_trace_id(Event, Id) ->
{event,
erlang:element(2, Event),
erlang:element(3, Event),
erlang:element(4, Event),
erlang:element(5, Event),
automata@event@metadata:with_trace_id(erlang:element(6, Event), Id)}.
-file("src/automata/event.gleam", 63).
-spec with_attribute(event(EKS), binary(), binary()) -> event(EKS).
with_attribute(Event, Key, Value) ->
{event,
erlang:element(2, Event),
erlang:element(3, Event),
erlang:element(4, Event),
erlang:element(5, Event),
automata@event@metadata:with_attribute(
erlang:element(6, Event),
Key,
Value
)}.
-file("src/automata/event.gleam", 82).
?DOC(
" Derive a new event whose metadata chains from `parent`.\n"
"\n"
" Inherits the parent's `correlation_id`, `trace_id`, and the full\n"
" `attributes` dict, and sets `causation_id` to `parent.id`. Use this\n"
" when one event triggers another so the chain of custody — and any\n"
" attributes that describe the chain itself (tenant, user, request id,\n"
" etc.) — is preserved without manual bookkeeping. Reach for\n"
" `event.new` plus `with_metadata(metadata.empty())` when the child\n"
" should start with a fresh attribute set; the inherited identifiers\n"
" are the same value the parent had, so the child can always rebuild\n"
" them explicitly when needed.\n"
).
-spec continue_from(
event(any()),
binary(),
automata@schedule@ast:valid_date_time(),
automata@event@source:source(),
EKX
) -> event(EKX).
continue_from(Parent, Id, Occurred_at, Source, Body) ->
Parent_meta = erlang:element(6, Parent),
Chained = {metadata,
erlang:element(2, Parent_meta),
{some, erlang:element(2, Parent)},
erlang:element(4, Parent_meta),
erlang:element(5, Parent_meta)},
{event, Id, Occurred_at, Source, Body, Chained}.