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(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}.