Skip to main content

src/aion@activity.erl

-module(aion@activity).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aion/activity.gleam").
-export([new/5, retry/2, timeout/2, heartbeat/2, name/1, input/1, input_codec/1, output_codec/1, runner/1, retry_policy/1, timeout_duration/1, heartbeat_interval/1]).
-export_type([backoff/0, retry_policy/0, activity/2]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(" Typed activity values and policy configuration.\n").

-type backoff() :: {exponential,
        aion@duration:duration(),
        float(),
        aion@duration:duration()} |
    {linear,
        aion@duration:duration(),
        aion@duration:duration(),
        aion@duration:duration()} |
    {fixed, aion@duration:duration()}.

-type retry_policy() :: {retry_policy, integer(), backoff()}.

-opaque activity(DPB, DPC) :: {activity,
        binary(),
        DPB,
        aion@codec:codec(DPB),
        aion@codec:codec(DPC),
        fun((DPB) -> {ok, DPC} | {error, aion@error:activity_error()}),
        gleam@option:option(retry_policy()),
        gleam@option:option(aion@duration:duration()),
        gleam@option:option(aion@duration:duration())}.

-file("src/aion/activity.gleam", 64).
?DOC(
    " Build a typed activity value with no retry, timeout, or heartbeat config.\n"
    "\n"
    " Absence of config is intentional data: there are no hidden defaults. In\n"
    " particular, an activity with no `retry` decorator runs exactly once when it\n"
    " is dispatched by the engine.\n"
).
-spec new(
    binary(),
    DPD,
    aion@codec:codec(DPD),
    aion@codec:codec(DPF),
    fun((DPD) -> {ok, DPF} | {error, aion@error:activity_error()})
) -> activity(DPD, DPF).
new(Name, Input, Input_codec, Output_codec, Run) ->
    {activity, Name, Input, Input_codec, Output_codec, Run, none, none, none}.

-file("src/aion/activity.gleam", 87).
?DOC(
    " Attach an explicit retry policy to an activity.\n"
    "\n"
    " Later calls replace earlier retry policy values; the SDK does not merge or\n"
    " synthesize policy fields.\n"
).
-spec retry(activity(DPL, DPM), retry_policy()) -> activity(DPL, DPM).
retry(Activity, Policy) ->
    {activity,
        erlang:element(2, Activity),
        erlang:element(3, Activity),
        erlang:element(4, Activity),
        erlang:element(5, Activity),
        erlang:element(6, Activity),
        {some, Policy},
        erlang:element(8, Activity),
        erlang:element(9, Activity)}.

-file("src/aion/activity.gleam", 101).
?DOC(" Attach an explicit timeout duration to an activity.\n").
-spec timeout(activity(DPR, DPS), aion@duration:duration()) -> activity(DPR, DPS).
timeout(Activity, Timeout_duration) ->
    {activity,
        erlang:element(2, Activity),
        erlang:element(3, Activity),
        erlang:element(4, Activity),
        erlang:element(5, Activity),
        erlang:element(6, Activity),
        erlang:element(7, Activity),
        {some, Timeout_duration},
        erlang:element(9, Activity)}.

-file("src/aion/activity.gleam", 118).
?DOC(" Attach an explicit heartbeat interval to an activity.\n").
-spec heartbeat(activity(DPX, DPY), aion@duration:duration()) -> activity(DPX, DPY).
heartbeat(Activity, Heartbeat_interval) ->
    {activity,
        erlang:element(2, Activity),
        erlang:element(3, Activity),
        erlang:element(4, Activity),
        erlang:element(5, Activity),
        erlang:element(6, Activity),
        erlang:element(7, Activity),
        erlang:element(8, Activity),
        {some, Heartbeat_interval}}.

-file("src/aion/activity.gleam", 135).
?DOC(" Return the activity name used by the engine dispatch boundary.\n").
-spec name(activity(any(), any())) -> binary().
name(Activity) ->
    erlang:element(2, Activity).

-file("src/aion/activity.gleam", 140).
?DOC(" Return the typed input captured by the activity value.\n").
-spec input(activity(DQH, any())) -> DQH.
input(Activity) ->
    erlang:element(3, Activity).

-file("src/aion/activity.gleam", 145).
?DOC(" Return the typed input codec captured by the activity value.\n").
-spec input_codec(activity(DQL, any())) -> aion@codec:codec(DQL).
input_codec(Activity) ->
    erlang:element(4, Activity).

-file("src/aion/activity.gleam", 150).
?DOC(" Return the typed output codec captured by the activity value.\n").
-spec output_codec(activity(any(), DQR)) -> aion@codec:codec(DQR).
output_codec(Activity) ->
    erlang:element(5, Activity).

-file("src/aion/activity.gleam", 155).
?DOC(" Return the typed runner captured by the activity value.\n").
-spec runner(activity(DQV, DQW)) -> fun((DQV) -> {ok, DQW} |
    {error, aion@error:activity_error()}).
runner(Activity) ->
    erlang:element(6, Activity).

-file("src/aion/activity.gleam", 162).
?DOC(" Return the explicitly attached retry policy, if one exists.\n").
-spec retry_policy(activity(any(), any())) -> gleam@option:option(retry_policy()).
retry_policy(Activity) ->
    erlang:element(7, Activity).

-file("src/aion/activity.gleam", 167).
?DOC(" Return the explicitly attached timeout duration, if one exists.\n").
-spec timeout_duration(activity(any(), any())) -> gleam@option:option(aion@duration:duration()).
timeout_duration(Activity) ->
    erlang:element(8, Activity).

-file("src/aion/activity.gleam", 172).
?DOC(" Return the explicitly attached heartbeat interval, if one exists.\n").
-spec heartbeat_interval(activity(any(), any())) -> gleam@option:option(aion@duration:duration()).
heartbeat_interval(Activity) ->
    erlang:element(9, Activity).