Current section

Files

Jump to
automata src automata@event.erl
Raw

src/automata@event.erl

-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(EKU) :: {event,
binary(),
automata@schedule@ast:valid_date_time(),
automata@event@source:source(),
EKU,
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(),
EKV
) -> event(EKV).
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(EKX), automata@event@metadata:metadata()) -> event(EKX).
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(ELA), binary()) -> event(ELA).
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(ELD), binary()) -> event(ELD).
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(ELG), binary()) -> event(ELG).
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(ELJ), binary(), binary()) -> event(ELJ).
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(),
ELO
) -> event(ELO).
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}.