Skip to main content

src/aion@error.erl

-module(aion@error).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aion/error.gleam").
-export([retryable/1, retryable_with_details/2, terminal/1, terminal_with_details/2]).
-export_type([activity_error/0, timeout_error/0, cancellation_error/0, non_determinism_error/0, engine_error/0, workflow_error/0, boundary_decode_error/0, receive_error/0, query_error/0, child_error/1, timeout_result_error/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.

?MODULEDOC(
    " Typed error taxonomy for Aion workflow authors.\n"
    "\n"
    " The `aion_flow` package models failure as data. Public fallible functions\n"
    " return typed `Result` errors; library code must not panic, call `todo`, or\n"
    " use assertions as control flow. Activity failures, decode failures, engine\n"
    " lifecycle failures, non-determinism, and unknown live-interaction names are\n"
    " all represented by the types in this module.\n"
).

-type activity_error() :: {retryable, binary(), binary()} |
    {terminal, binary(), binary()} |
    {activity_decode_failed, aion@codec:decode_error()} |
    {activity_timed_out, timeout_error()} |
    {activity_cancelled, cancellation_error()} |
    {activity_non_deterministic, non_determinism_error()} |
    {activity_engine_failure, binary()}.

-type timeout_error() :: {timed_out, binary()}.

-type cancellation_error() :: {cancelled, binary()}.

-type non_determinism_error() :: {non_determinism_violation, binary()}.

-type engine_error() :: {engine_failure, binary()}.

-type workflow_error() :: {workflow_engine_failure, binary()}.

-type boundary_decode_error() :: {decode_failed, aion@codec:decode_error()}.

-type receive_error() :: {receive_decode_failed, aion@codec:decode_error()} |
    {unknown_signal, binary()} |
    {receive_cancelled, cancellation_error()} |
    {receive_non_deterministic, non_determinism_error()} |
    {receive_engine_failure, binary()}.

-type query_error() :: {query_decode_failed, aion@codec:decode_error()} |
    {unknown_query, binary()} |
    {query_timed_out, timeout_error()} |
    {query_not_running, binary()} |
    {query_handler_failed, binary()} |
    {query_engine_failure, binary()}.

-type child_error(DOY) :: {child_workflow_failed, DOY} |
    {child_output_decode_failed, aion@codec:decode_error()} |
    {child_error_decode_failed, aion@codec:decode_error()} |
    {child_engine_failure, binary()}.

-type timeout_result_error(DOZ) :: {timed_out_error, timeout_error()} |
    {inner_error, DOZ} |
    {timeout_engine_failure, binary()}.

-file("src/aion/error.gleam", 37).
?DOC(" Construct a retryable activity failure with no detail payload.\n").
-spec retryable(binary()) -> activity_error().
retryable(Message) ->
    {retryable, Message, <<""/utf8>>}.

-file("src/aion/error.gleam", 42).
?DOC(" Construct a retryable activity failure with an encoded detail payload.\n").
-spec retryable_with_details(binary(), binary()) -> activity_error().
retryable_with_details(Message, Details) ->
    {retryable, Message, Details}.

-file("src/aion/error.gleam", 50).
?DOC(" Construct a terminal activity failure with no detail payload.\n").
-spec terminal(binary()) -> activity_error().
terminal(Message) ->
    {terminal, Message, <<""/utf8>>}.

-file("src/aion/error.gleam", 55).
?DOC(" Construct a terminal activity failure with an encoded detail payload.\n").
-spec terminal_with_details(binary(), binary()) -> activity_error().
terminal_with_details(Message, Details) ->
    {terminal, Message, Details}.