-module(aion_client@error).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/aion_client/error.gleam").
-export([from_wire/2, from_http_status/2, transport_failure/0]).
-export_type([error/0, wire_error_code/0]).
-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(" Shared caller-side SDK error taxonomy.\n").
-type error() :: not_found |
already_exists |
query_failed |
query_timeout |
cancelled |
unavailable |
unauthenticated |
{namespace_denied, binary()} |
invalid_argument |
{server, binary()}.
-type wire_error_code() :: wire_not_found |
wire_namespace_denied |
wire_sequence_conflict |
wire_unknown_query |
wire_query_timeout |
wire_not_running |
wire_lagged |
wire_invalid_input |
wire_backend |
wire_query_failed |
{wire_unknown, binary()}.
-file("src/aion_client/error.gleam", 47).
?DOC(
" Map an AW wire error code into the shared client taxonomy.\n"
"\n"
" `WireSequenceConflict` is the server's internal double-writer-bug signal\n"
" (a single-writer invariant violation), never an idempotency outcome, so it\n"
" surfaces as `Server` rather than `AlreadyExists`.\n"
).
-spec from_wire(wire_error_code(), binary()) -> error().
from_wire(Code, Detail) ->
case Code of
wire_not_found ->
not_found;
wire_namespace_denied ->
{namespace_denied, Detail};
wire_sequence_conflict ->
{server, Detail};
wire_unknown_query ->
invalid_argument;
wire_query_timeout ->
query_timeout;
wire_not_running ->
invalid_argument;
wire_lagged ->
unavailable;
wire_invalid_input ->
invalid_argument;
wire_backend ->
{server, Detail};
wire_query_failed ->
query_failed;
{wire_unknown, _} ->
{server, Detail}
end.
-file("src/aion_client/error.gleam", 68).
?DOC(
" Map HTTP status codes used by aion-server into the shared taxonomy.\n"
" aion-server returns 401 exclusively for credential failure and 403\n"
" exclusively for namespace denial. Gateway statuses 502/503/504 signal\n"
" transient unreachability and map to the retryable `Unavailable`; 500 and\n"
" any unrecognised status are server faults.\n"
).
-spec from_http_status(integer(), binary()) -> error().
from_http_status(Status, Detail) ->
case Status of
400 ->
invalid_argument;
401 ->
unauthenticated;
403 ->
{namespace_denied, Detail};
404 ->
not_found;
408 ->
query_timeout;
409 ->
already_exists;
412 ->
invalid_argument;
429 ->
unavailable;
499 ->
cancelled;
500 ->
{server, Detail};
502 ->
unavailable;
503 ->
unavailable;
504 ->
unavailable;
_ ->
{server, Detail}
end.
-file("src/aion_client/error.gleam", 87).
?DOC(
" Transport, DNS, TLS, socket, and transient stream failures are retryable\n"
" availability failures in the contract.\n"
).
-spec transport_failure() -> error().
transport_failure() ->
unavailable.